Remove obsolete file.
authorKarl Schultz <kschultz@freedesktop.org>
Thu, 24 Jul 2003 03:35:34 +0000 (03:35 +0000)
committerKarl Schultz <kschultz@freedesktop.org>
Thu, 24 Jul 2003 03:35:34 +0000 (03:35 +0000)
src/mesa/drivers/windows/mesa_extend.c [deleted file]
src/mesa/drivers/windows/mesa_extend.h [deleted file]
src/mesa/drivers/windows/stereo.h [deleted file]
src/mesa/drivers/windows/wing32.def [deleted file]
src/mesa/drivers/windows/wmesaBackup.c [deleted file]
src/mesa/drivers/windows/wmesaOld.c [deleted file]
src/mesa/drivers/windows/wmesa_stereo.c [deleted file]

diff --git a/src/mesa/drivers/windows/mesa_extend.c b/src/mesa/drivers/windows/mesa_extend.c
deleted file mode 100644 (file)
index 933e3ba..0000000
+++ /dev/null
@@ -1,211 +0,0 @@
-/* File: mesa_extend.c for wmesa-2.3\r
-   Written by Li Wei (liwei@aiar.xjtu.edu.cn)\r
-*/\r
-\r
-/*******************************************************************\r
- Users can use the following keys to control the view\r
-\r
- The following four key combinations can shift the view correspondingly,\r
- function in both stereo and normal mode.\r
- Ctrl+left arrow\r
- Ctrl+right arrow\r
- Ctrl+up arrow\r
- Ctrl+down arrow\r
-\r
- F (captital letter) shift the camera far from objects\r
- N (captital letter) shift the camera near from objects\r
- S (captital letter) toggle between normal and stereo mode\r
- I (captital letter) increase the distance between two views\r
- D (captital letter) decrease the distance between two views\r
-\r
- if the Key function defined by user maps any key appearing above, it will be\r
- masked by the program. Hence, user should either modify his own code or\r
- modify function defaultKeyProc at the end of this file \r
-*******************************************************************/\r
-\r
-/* Log 6/14, 1997\r
- * revision 1.01\r
- * struct DisplayOptions defined for tk_ddmesa.c to read the initial file\r
- */\r
-\r
-#include "mesa_extend.h"\r
-#include "gltk.h"\r
-#include <stdio.h>\r
-#ifndef NO_STEREO\r
-       #include "stereo.h"\r
-#endif\r
-#ifndef NO_PARALLEL\r
-//     #include "parallel.h"\r
-#endif\r
-\r
-GLenum (*userKeyProc) (int, GLenum) = NULL;\r
-\r
-GLfloat viewDistance = 1.0;\r
-GLfloat deltaView = 0.1;\r
-GLfloat deltaShift = 0.1;\r
-\r
-GLuint viewShift = SHIFT_NONE;\r
-GLuint viewTag = 0 ;\r
-\r
-GLenum imageRendered = GL_FALSE;\r
-\r
-GLenum glImageRendered()\r
-{\r
-       return imageRendered; \r
-}\r
-\r
-//Code added by Li Wei to enable stereo display\r
-GLenum defaultKeyProc(int key, GLenum mask )\r
-{\r
-       GLenum flag = GL_FALSE ;\r
-       if(mask & TK_CONTROL){\r
-       flag = GL_TRUE ;\r
-       switch(key){\r
-               case TK_LEFT:\r
-               viewShift = SHIFT_LEFT;\r
-               break;\r
-               case TK_RIGHT:\r
-               viewShift = SHIFT_RIGHT;\r
-               break;\r
-               case TK_UP:\r
-               viewShift = SHIFT_UP;\r
-               break;\r
-               case TK_DOWN:\r
-               viewShift = SHIFT_DOWN;\r
-               break;\r
-               default:\r
-                       flag = GL_FALSE ;\r
-               }\r
-       }\r
-       if(flag == GL_FALSE){\r
-       flag = GL_TRUE ;\r
-       switch(key){\r
-               case TK_F:\r
-               viewShift = SHIFT_FAR;\r
-               break;\r
-               case TK_N:\r
-               viewShift = SHIFT_NEAR;\r
-               break;\r
-\r
-#if !defined(NO_STEREO)\r
-               case TK_D:\r
-               viewDistance-= deltaView;\r
-               break;\r
-               case TK_I:\r
-               viewDistance+= deltaView;\r
-               break;\r
-               case TK_S:\r
-               toggleStereoMode();\r
-               break;\r
-#endif\r
-\r
-#if !defined(NO_PARALLEL)\r
-               case TK_P:\r
-               if(machineType == MASTER)\r
-                       toggleParallelMode();\r
-               break;\r
-#endif\r
-               default:\r
-                       flag = GL_FALSE;\r
-               }\r
-               }\r
-\r
-       if(userKeyProc)\r
-               flag=flag||(*userKeyProc)(key, mask);\r
-\r
-#if !defined(NO_PARALLEL)\r
-       if(parallelFlag&&key!=TK_P&&machineType == MASTER){\r
-               PRKeyDown(key,mask);\r
-       }\r
-#endif\r
-\r
-       return flag;\r
-}\r
-\r
-/* The following function implemented key board control of the display,\r
-       availabe even in normal mode so long the driver is linked into exe file.\r
-*/\r
-void shiftView()\r
-{\r
-       GLfloat cm[16];\r
-       if(viewShift != SHIFT_NONE){\r
-/*     glGetFloatv(GL_MODELVIEW_MATRIX,cm);\r
-       glMatrixMode(GL_MODELVIEW);\r
-*/\r
-    GLint matrix_mode;\r
-    glGetIntegerv(GL_MATRIX_MODE,&matrix_mode);\r
-/*     if(matrix_mode!=GL_PROJECTION)\r
-        glMatrixMode(GL_PROJECTION);\r
-    glGetFloatv(GL_PROJECTION_MATRIX,cm);\r
-    glLoadIdentity();\r
-       switch(viewShift){\r
-               case SHIFT_LEFT:\r
-                       glTranslatef(-deltaShift,0,0);\r
-                       break;\r
-               case SHIFT_RIGHT:\r
-                       glTranslatef(deltaShift,0,0);\r
-                       break;\r
-               case SHIFT_UP:\r
-                       glTranslatef(0,deltaShift,0);\r
-                       break;\r
-               case SHIFT_DOWN:\r
-                       glTranslatef(0,-deltaShift,0);\r
-                       break;\r
-               case SHIFT_FAR:\r
-                       glTranslatef(0,0,-deltaShift);\r
-                       break;\r
-               case SHIFT_NEAR:\r
-                       glTranslatef(0,0,deltaShift);\r
-                       break;\r
-               }\r
-\r
-               viewShift = SHIFT_NONE;\r
-               glMultMatrixf( cm );\r
-        if(matrix_mode!=GL_PROJECTION)\r
-            glMatrixMode(matrix_mode);\r
-\r
-       }\r
-*/\r
-       if(matrix_mode!=GL_MODELVIEW)\r
-        glMatrixMode(GL_MODELVIEW);\r
-    glGetFloatv(GL_MODELVIEW_MATRIX,cm);\r
-    glLoadIdentity();\r
-       switch(viewShift){\r
-               case SHIFT_LEFT:\r
-                       glTranslatef(-deltaShift,0,0);\r
-                       break;\r
-               case SHIFT_RIGHT:\r
-                       glTranslatef(deltaShift,0,0);\r
-                       break;\r
-               case SHIFT_UP:\r
-                       glTranslatef(0,deltaShift,0);\r
-                       break;\r
-               case SHIFT_DOWN:\r
-                       glTranslatef(0,-deltaShift,0);\r
-                       break;\r
-               case SHIFT_FAR:\r
-                       glTranslatef(0,0,-deltaShift);\r
-                       break;\r
-               case SHIFT_NEAR:\r
-                       glTranslatef(0,0,deltaShift);\r
-                       break;\r
-               }\r
-\r
-               viewShift = SHIFT_NONE;\r
-               glMultMatrixf( cm );\r
-        if(matrix_mode!=GL_MODELVIEW)\r
-            glMatrixMode(matrix_mode);\r
-\r
-       }\r
-}\r
-\r
-\r
-void getDisplayOptions( void)\r
-{\r
-       displayOptions.stereo = GetPrivateProfileInt("DISPLAY", "STEREO",1,"ddmesa.ini" );\r
-       displayOptions.fullScreen = GetPrivateProfileInt("DISPLAY", "FULLSCREEN",0,"ddmesa.ini" );\r
-       displayOptions.mode = GetPrivateProfileInt("DISPLAY", "MODE",1, "ddmesa.ini");\r
-       displayOptions.bpp = GetPrivateProfileInt("DISPLAY", "BPP", 32, "ddmesa.ini");\r
-\r
-}\r
-//end modification\r
diff --git a/src/mesa/drivers/windows/mesa_extend.h b/src/mesa/drivers/windows/mesa_extend.h
deleted file mode 100644 (file)
index 4720713..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-/* mesa_extend.h
- * for wmesa-2.3
- *  Written by Li Wei (liwei@aiar.xjtu.edu.cn)
- */
-
-/* Log 6/14, 1997
- * revision 1.01
- * struct DisplayOptions defined for tk_ddmesa.c to read the initial file
- */
-
-#include <GL/gl.h>
-#include <stdlib.h>
-#include <windows.h>
-#include <winbase.h>
-
-typedef enum SHIFT{ SHIFT_NONE, SHIFT_LEFT,SHIFT_RIGHT,SHIFT_UP,SHIFT_DOWN,SHIFT_FAR,SHIFT_NEAR};
-
-extern GLfloat deltaView ;
-
-extern GLuint viewShift;
-
-extern GLenum glImageRendered();
-
-extern GLenum imageRendered ;
-
-extern GLfloat deltaView ;
-
-extern GLfloat deltaShift;
-
-void shiftView( void );
-
-struct DISPLAY_OPTIONS {
-       int  stereo;
-       int  fullScreen;
-       int      mode;
-       int      bpp;
-};
-
-extern struct DISPLAY_OPTIONS displayOptions;
-extern void getDisplayOptions( void);
-
-GLenum defaultKeyProc(int, GLenum);
-extern GLenum (*userKeyProc) (int, GLenum);
diff --git a/src/mesa/drivers/windows/stereo.h b/src/mesa/drivers/windows/stereo.h
deleted file mode 100644 (file)
index 544af54..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/* File name stereov.h\r
-   header file for stereo display driver \r
-***************************************************************\r
-*                     WMesa                                   *\r
-*                     version 2.3                             *        \r
-*                                                             *\r
-*                        By                                   *\r
-*                      Li Wei                                 *\r
-*       Institute of Artificial Intelligence & Robotics       *\r
-*       Xi'an Jiaotong University                             *\r
-*       Email: liwei@aiar.xjtu.edu.cn                         * \r
-*       Web page: http://sun.aiar.xjtu.edu.cn                 *\r
-*                                                             *\r
-*             July 7th, 1997                                                 * \r
-***************************************************************\r
-\r
-*/\r
-#if defined( __WIN32__) || defined (WIN32)\r
-   #include <windows.h>\r
-#endif\r
-\r
-typedef enum VIEW_INDICATOR { FIRST, SECOND};\r
-\r
-#define MAXIMUM_DISPLAY_LIST 99\r
-\r
-extern GLenum stereoBuffer;\r
-\r
-extern GLint displayList;\r
-\r
-extern GLint stereo_flag ;\r
-\r
-extern GLfloat viewDistance;\r
-\r
-extern GLuint viewTag;\r
-\r
-extern GLuint displayListBase;\r
-\r
-extern GLuint numOfLists;\r
-\r
-extern GLenum stereoCompile;\r
-\r
-extern GLenum stereoShowing;\r
-\r
-extern void glShowStereo(GLuint list);\r
-\r
-extern void toggleStereoMode();\r
-\r
diff --git a/src/mesa/drivers/windows/wing32.def b/src/mesa/drivers/windows/wing32.def
deleted file mode 100644 (file)
index ac8fc1d..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-EXPORTS
-        WinGBitBlt@32
-        WinGCreateBitmap@12
-        WinGCreateDC@0
-        WinGCreateHalftoneBrush@12
-        WinGCreateHalftonePalette@0
-        WinGGetDIBColorTable@16
-        WinGGetDIBPointer@8
-        WinGRecommendDIBFormat@4
-        WinGSetDIBColorTable@16
-        WinGStretchBlt@40
-
diff --git a/src/mesa/drivers/windows/wmesaBackup.c b/src/mesa/drivers/windows/wmesaBackup.c
deleted file mode 100644 (file)
index 33a7c40..0000000
+++ /dev/null
@@ -1,2891 +0,0 @@
-/* $Id: wmesaBackup.c,v 1.3 2001/03/03 20:33:29 brianp Exp $ */
-
-/*
-*   File name   :   wmesa.c
-*  Version      :   2.3
-*
-*  Display driver for Mesa 2.3  under
-*   Windows95 and WindowsNT
-*
-*   Copyright (C) 1996-  Li Wei
-*  Address      :       Institute of Artificial Intelligence
-*               :           & Robotics
-*               :       Xi'an Jiaotong University
-*  Email        :       liwei@aiar.xjtu.edu.cn
-*  Web page :       http://sun.aiar.xjtu.edu.cn
-*
-*  This file and its associations are partially borrowed from the
-*  Windows NT driver for Mesa 1.8 , written by Mark Leaming
-*  (mark@rsinc.com).
-*/
-
-
-/*
- * $Log: wmesaBackup.c,v $
- * Revision 1.3  2001/03/03 20:33:29  brianp
- * lots of gl_*() to _mesa_*() namespace clean-up
- *
- * Revision 1.2  2000/11/05 18:41:00  keithw
- * - Changes for new software rasterizer modules
- * - Remove support for choosing software fallbacks from core code
- * - Remove partial fallback code from vbrender.c -- drivers are now
- *   expected to be able to find a triangle/quad function for every state,
- *   even if they have to use _swsetup_Triangle or _swsetup_Quad.
- * - Marked derived variables in the GLcontext struct with a leading
- *   underscore '_'.
- *
- * Revision 1.1.1.1  1999/08/19 00:55:42  jtg
- * Imported sources
- *
- * Revision 1.1  1999/01/03 03:08:57  brianp
- * Initial revision
- *
- * Revision 3.1  1998/06/11 01:42:08  brianp
- * updated for Mesa 3.0 device driver interface (but not tested)
- *
- * Revision 3.0  1998/06/11 01:18:25  brianp
- * initial revision
- *
- */
-
-
-#define WMESA_STEREO_C
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <GL/wmesa.h>
-#include "mesa_extend.h"
-#include "colors.h"
-#include "macros.h"
-#include "context.h"
-#include "dd.h"
-#include "xform.h"
-#include "vb.h"
-#include "matrix.h"
-#include "depth.h"
-#include "wmesadef.h"
-
-#pragma warning ( disable : 4133 4761 )
-
-#ifdef PROFILE
-//  #include "profile.h"
-#endif
-
-#ifdef DITHER
-#include <wing.h>
-#endif
-
-#ifdef __CYGWIN32__
-#include "macros.h"
-#include <string.h>
-#define CopyMemory memcpy
-#endif
-
-#if !defined(NO_STEREO)
-
-#include "gl\glu.h"
-#include "stereo.h"
-
-#endif
-#if !defined(NO_PARALLEL)
-//  #include "parallel.h"
-#endif
-
-struct DISPLAY_OPTIONS displayOptions;
-
-GLenum stereoCompile = GL_FALSE ;
-GLenum stereoShowing  = GL_FALSE ;
-GLenum stereoBuffer = GL_FALSE;
-#if !defined(NO_STEREO)
-GLint displayList = MAXIMUM_DISPLAY_LIST ;
-#endif
-GLint stereo_flag = 0 ;
-
-/* end of added code*/
-
-static PWMC Current = NULL;
-WMesaContext WC = NULL;
-
-#ifdef NDEBUG
-#define assert(ignore)  ((void) 0)
-#else
-void Mesa_Assert(void *Cond,void *File,unsigned Line)
-{
-    char Msg[512];
-    sprintf(Msg,"%s %s %d",Cond,File,Line);
-    MessageBox(NULL,Msg,"Assertion failed.",MB_OK);
-    exit(1);
-}
-#define assert(e)   if (!e) Mesa_Assert(#e,__FILE__,__LINE__);
-#endif
-
-//#define DD_GETDC (Current->hDC )
-#define DD_GETDC ((Current->db_flag) ? Current->dib.hDC : Current->hDC )
-//#define DD_GETDC ((Current->db_flag) ? Current->hDCPrimary : Current->hDCBack )
-#define DD_RELEASEDC
-
-//#define BEGINGDICALL  if(Current->rgb_flag)wmFlushBits(Current);
-#define BEGINGDICALL
-//#define ENDGDICALL        if(Current->rgb_flag)wmGetBits(Current);
-#define ENDGDICALL
-
-//#define FLIP(Y)  (Current->dither_flag? Y : Current->height-(Y)-1)
-//#define FLIP(Y)  (Current->height-(Y)-1)
-//#define FLIP(Y) Y
-#define FLIP(Y)  (Current->db_flag? Y: Current->height-(Y)-1)
-#define STARTPROFILE
-#define ENDPROFILE(PARA)
-
-#define DITHER_RGB_TO_8BIT_SETUP            \
-GLubyte pixelDithered;
-
-#define DITHER_RGB_TO_8BIT(red, green, blue, pixel, scanline)               \
-{                                                                           \
-    char unsigned redtemp, greentemp, bluetemp, paletteindex;               \
-    redtemp = aDividedBy51[red]                                             \
-    + (aModulo51[red] > aHalftone8x8[(pixel%8)*8                        \
-    + scanline%8]);                                                 \
-    greentemp = aDividedBy51[(char unsigned)green]                          \
-    + (aModulo51[green] > aHalftone8x8[                             \
-    (pixel%8)*8 + scanline%8]);                                     \
-    bluetemp = aDividedBy51[(char unsigned)blue]                            \
-    + (aModulo51[blue] > aHalftone8x8[                              \
-    (pixel%8)*8 +scanline%8]);                                      \
-    paletteindex = redtemp + aTimes6[greentemp] + aTimes36[bluetemp];       \
-    pixelDithered = aWinGHalftoneTranslation[paletteindex];                 \
-}
-
-
-#ifdef DDRAW
-static BOOL DDInit( WMesaContext wc, HWND hwnd);
-static void DDFree( WMesaContext wc);
-static HRESULT DDRestoreAll( WMesaContext wc );
-static void DDDeleteOffScreen(WMesaContext wc);
-static BOOL DDCreateOffScreen(WMesaContext wc);
-#endif
-
-static void FlushToFile(PWMC pwc, PSTR  szFile);
-
-BOOL wmCreateBackingStore(PWMC pwc, long lxSize, long lySize);
-BOOL wmDeleteBackingStore(PWMC pwc);
-void wmCreatePalette( PWMC pwdc );
-BOOL wmSetDibColors(PWMC pwc);
-void wmSetPixel(PWMC pwc, int iScanLine, int iPixel, BYTE r, BYTE g, BYTE b);
-
-void wmCreateDIBSection(
-                        HDC  hDC,
-                        PWMC pwc,   // handle of device context
-                        CONST BITMAPINFO *pbmi, // address of structure containing bitmap size, format, and color data
-                        UINT iUsage // color data type indicator: RGB values or palette indices
-                        );
-
-
-void WMesaViewport( GLcontext *ctx,
-                    GLint x, GLint y, GLsizei width, GLsizei height );
-
-
-static triangle_func choose_triangle_function( GLcontext *ctx );
-
-
-static void wmSetPixelFormat( PWMC wc, HDC hDC)
-{
-    if(wc->rgb_flag)
-        wc->cColorBits = GetDeviceCaps(hDC, BITSPIXEL);
-    else
-        wc->cColorBits = 8;
-    switch(wc->cColorBits){
-    case 8:
-        if(wc->dither_flag != GL_TRUE)
-            wc->pixelformat = PF_INDEX8;
-        else
-            wc->pixelformat = PF_DITHER8;
-        break;
-    case 16:
-        wc->pixelformat = PF_5R6G5B;
-        break;
-    case 32:
-        wc->pixelformat = PF_8R8G8B;
-        break;
-    default:
-        wc->pixelformat = PF_BADFORMAT;
-    }
-}
-
-//
-// This function sets the color table of a DIB section
-// to match that of the destination DC
-//
-BOOL /*WINAPI*/ wmSetDibColors(PWMC pwc)
-{
-    RGBQUAD         *pColTab, *pRGB;
-    PALETTEENTRY    *pPal, *pPE;
-    int             i, nColors;
-    BOOL            bRet=TRUE;
-    DWORD           dwErr=0;
-
-    /* Build a color table in the DIB that maps to the
-    selected palette in the DC.
-    */
-    nColors = 1 << pwc->cColorBits;
-    pPal = (PALETTEENTRY *)malloc( nColors * sizeof(PALETTEENTRY));
-    memset( pPal, 0, nColors * sizeof(PALETTEENTRY) );
-    GetPaletteEntries( pwc->hGLPalette, 0, nColors, pPal );
-    pColTab = (RGBQUAD *)malloc( nColors * sizeof(RGBQUAD));
-    for (i = 0, pRGB = pColTab, pPE = pPal; i < nColors; i++, pRGB++, pPE++) {
-        pRGB->rgbRed = pPE->peRed;
-        pRGB->rgbGreen = pPE->peGreen;
-        pRGB->rgbBlue = pPE->peBlue;
-    }
-    if(pwc->db_flag)
-        bRet = SetDIBColorTable(pwc->dib.hDC, 0, nColors, pColTab );
-
-    if(!bRet)
-        dwErr = GetLastError();
-
-    free( pColTab );
-    free( pPal );
-
-    return(bRet);
-}
-
-
-//
-// Free up the dib section that was created
-//
-BOOL wmDeleteBackingStore(PWMC pwc)
-{
-    SelectObject(pwc->dib.hDC, pwc->hOldBitmap);
-    DeleteDC(pwc->dib.hDC);
-    DeleteObject(pwc->hbmDIB);
-    UnmapViewOfFile(pwc->dib.base);
-    CloseHandle(pwc->dib.hFileMap);
-    return TRUE;
-}
-
-
-//
-// This function creates the DIB section that is used for combined
-// GL and GDI calls
-//
-BOOL /*WINAPI*/ wmCreateBackingStore(PWMC pwc, long lxSize, long lySize)
-{
-    HDC hdc = pwc->hDC;
-    LPBITMAPINFO pbmi = &(pwc->bmi);
-    int     iUsage;
-
-    pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
-    pbmi->bmiHeader.biWidth = lxSize;
-    pbmi->bmiHeader.biHeight= -lySize;
-    pbmi->bmiHeader.biPlanes = 1;
-    if(pwc->rgb_flag)
-        pbmi->bmiHeader.biBitCount = GetDeviceCaps(pwc->hDC, BITSPIXEL);
-    else
-        pbmi->bmiHeader.biBitCount = 8;
-    pbmi->bmiHeader.biCompression = BI_RGB;
-    pbmi->bmiHeader.biSizeImage = 0;
-    pbmi->bmiHeader.biXPelsPerMeter = 0;
-    pbmi->bmiHeader.biYPelsPerMeter = 0;
-    pbmi->bmiHeader.biClrUsed = 0;
-    pbmi->bmiHeader.biClrImportant = 0;
-
-    iUsage = (pbmi->bmiHeader.biBitCount <= 8) ? DIB_PAL_COLORS : DIB_RGB_COLORS;
-
-    pwc->cColorBits = pbmi->bmiHeader.biBitCount;
-    pwc->ScanWidth = pwc->pitch = lxSize;
-
-    wmCreateDIBSection(hdc, pwc, pbmi, iUsage);
-
-    if ((iUsage == DIB_PAL_COLORS) && !(pwc->hGLPalette)) {
-        wmCreatePalette( pwc );
-        wmSetDibColors( pwc );
-    }
-    wmSetPixelFormat(pwc, pwc->hDC);
-    return(TRUE);
-
-}
-
-
-//
-// This function copies one scan line in a DIB section to another
-//
-BOOL GLWINAPI wmSetDIBits(PWMC pwc, UINT uiScanWidth, UINT uiNumScans, UINT nBypp, UINT uiNewWidth, LPBYTE pBits)
-{
-    UINT uiScans = 0;
-    LPBYTE  pDest = pwc->pbPixels;
-    DWORD   dwNextScan = uiScanWidth;
-    DWORD   dwNewScan = uiNewWidth;
-    DWORD   dwScanWidth = (uiScanWidth * nBypp);
-
-    //
-    // We need to round up to the nearest DWORD
-    // and multiply by the number of bytes per
-    // pixel
-    //
-    dwNextScan = (((dwNextScan * nBypp)+ 3) & ~3);
-    dwNewScan = (((dwNewScan * nBypp)+ 3) & ~3);
-
-    for(uiScans = 0; uiScans < uiNumScans; uiScans++){
-        CopyMemory(pDest, pBits, dwScanWidth);
-        pBits += dwNextScan;
-        pDest += dwNewScan;
-    }
-
-    return(TRUE);
-
-}
-
-
-BOOL wmFlush(PWMC pwc);
-
-/*
-* Useful macros:
-Modified from file osmesa.c
-*/
-
-
-#define PIXELADDR(X,Y)  ((GLubyte *)Current->pbPixels + (Current->height-Y-1)* Current->ScanWidth + (X)*nBypp)
-#define PIXELADDR1( X, Y )  \
-((GLubyte *)wmesa->pbPixels + (wmesa->height-Y-1)* wmesa->ScanWidth + (X))
-#define PIXELADDR2( X, Y )  \
-((GLubyte *)wmesa->pbPixels + (wmesa->height-Y-1)* wmesa->ScanWidth + (X)*2)
-#define PIXELADDR4( X, Y )  \
-((GLubyte *)wmesa->pbPixels + (wmesa->height-Y-1)* wmesa->ScanWidth + (X)*4)
-
-
-BYTE DITHER_RGB_2_8BIT( int r, int g, int b, int x, int y);
-
-/* Finish all pending operations and synchronize. */
-static void finish(GLcontext* ctx)
-{
-    /* No op */
-}
-
-
-//
-// We cache all gl draw routines until a flush is made
-//
-static void flush(GLcontext* ctx)
-{
-    STARTPROFILE
-        if((Current->rgb_flag /*&& !(Current->dib.fFlushed)*/&&!(Current->db_flag))
-            ||(!Current->rgb_flag))
-        {
-            wmFlush(Current);
-        }
-        ENDPROFILE(flush)
-
-}
-
-
-
-/*
-* Set the color index used to clear the color buffer.
-*/
-static void clear_index(GLcontext* ctx, GLuint index)
-{
-    STARTPROFILE
-        Current->clearpixel = index;
-    ENDPROFILE(clear_index)
-}
-
-
-
-/*
-* Set the color used to clear the color buffer.
-*/
-static void clear_color( GLcontext* ctx, GLubyte r, GLubyte g, GLubyte b, GLubyte a )
-{
-    STARTPROFILE
-        Current->clearpixel=RGB(r, g, b );
-    ENDPROFILE(clear_color)
-}
-
-
-
-/*
-* Clear the specified region of the color buffer using the clear color
-* or index as specified by one of the two functions above.
-*/
-//static void clear(GLcontext* ctx,
-//                  GLboolean all,GLint x, GLint y, GLint width, GLint height )
-// TODO: I modified this function to match the prototype in dd.h. (swansma@geocities.com)
-//       dd.h does not explain what the return type is so I could not set this to the proper
-//       value.
-static GLbitfield clear(GLcontext* ctx, GLbitfield mask,
-                  GLboolean all, GLint x, GLint y, GLint width, GLint height)
-{
-    DWORD   dwColor;
-    WORD    wColor;
-    BYTE    bColor;
-    LPDWORD lpdw = (LPDWORD)Current->pbPixels;
-    LPWORD  lpw = (LPWORD)Current->pbPixels;
-    LPBYTE  lpb = Current->pbPixels;
-    int     lines;
-
-    STARTPROFILE
-
-        if (all){
-            x=y=0;
-            width=Current->width;
-            height=Current->height;
-        }
-        if(Current->db_flag==GL_TRUE){
-            UINT    nBypp = Current->cColorBits / 8;
-            int     i = 0;
-            int     iSize = 0;
-
-            if(nBypp ==1 ){
-                /* Need rectification */
-                iSize = Current->width/4;
-                bColor  = BGR8(GetRValue(Current->clearpixel),
-                    GetGValue(Current->clearpixel),
-                    GetBValue(Current->clearpixel));
-                wColor  = MAKEWORD(bColor,bColor);
-                dwColor = MAKELONG(wColor, wColor);
-            }
-            if(nBypp == 2){
-                iSize = Current->width / 2;
-                wColor = BGR16(GetRValue(Current->clearpixel),
-                    GetGValue(Current->clearpixel),
-                    GetBValue(Current->clearpixel));
-                dwColor = MAKELONG(wColor, wColor);
-            }
-            else if(nBypp == 4){
-                iSize = Current->width;
-                dwColor = BGR32(GetRValue(Current->clearpixel),
-                    GetGValue(Current->clearpixel),
-                    GetBValue(Current->clearpixel));
-            }
-
-            while(i < iSize){
-                *lpdw = dwColor;
-                lpdw++;
-                i++;
-            }
-
-            //
-            // This is the 24bit case
-            //
-            if (nBypp == 3) {
-                iSize = Current->width *3/4;
-                dwColor = BGR24(GetRValue(Current->clearpixel),
-                    GetGValue(Current->clearpixel),
-                    GetBValue(Current->clearpixel));
-                while(i < iSize){
-                    *lpdw = dwColor;
-                    lpb += nBypp;
-                    lpdw = (LPDWORD)lpb;
-                    i++;
-                }
-            }
-
-            i = 0;
-            if (stereo_flag)
-               lines = height /2;
-            else
-               lines = height;
-            do {
-                memcpy(lpb, Current->pbPixels, iSize*4);
-                lpb += Current->ScanWidth;
-                i++;
-            }
-            while (i<lines-1);
-        }
-        else { // For single buffer
-            HDC DC=DD_GETDC;
-            HPEN Pen=CreatePen(PS_SOLID,1,Current->clearpixel);
-            HBRUSH Brush=CreateSolidBrush(Current->clearpixel);
-            HPEN Old_Pen=SelectObject(DC,Pen);
-            HBRUSH Old_Brush=SelectObject(DC,Brush);
-            Rectangle(DC,x,y,x+width,y+height);
-            SelectObject(DC,Old_Pen);
-            SelectObject(DC,Old_Brush);
-            DeleteObject(Pen);
-            DeleteObject(Brush);
-            DD_RELEASEDC;
-        }
-
-
-
-        ENDPROFILE(clear)
-
-               return mask;    // TODO: I doubt this is correct. dd.h doesn't explain what this should
-                               //       be...
-}
-
-
-
-/* Set the current color index. */
-static void set_index(GLcontext* ctx, GLuint index)
-{
-    STARTPROFILE
-        Current->pixel=index;
-    ENDPROFILE(set_index)
-}
-
-
-
-/* Set the current RGBA color. */
-static void set_color( GLcontext* ctx, GLubyte r, GLubyte g, GLubyte b, GLubyte a )
-{
-    STARTPROFILE
-        Current->pixel = RGB( r, g, b );
-    ENDPROFILE(set_color)
-}
-
-
-
-/* Set the index mode bitplane mask. */
-static GLboolean index_mask(GLcontext* ctx, GLuint mask)
-{
-    /* can't implement */
-    return GL_FALSE;
-}
-
-
-
-/* Set the RGBA drawing mask. */
-static GLboolean color_mask( GLcontext* ctx,
-                            GLboolean rmask, GLboolean gmask,
-                            GLboolean bmask, GLboolean amask)
-{
-    /* can't implement */
-    return GL_FALSE;
-}
-
-
-
-/*
-* Set the pixel logic operation.  Return GL_TRUE if the device driver
-* can perform the operation, otherwise return GL_FALSE.  If GL_FALSE
-* is returned, the logic op will be done in software by Mesa.
-*/
-GLboolean logicop( GLcontext* ctx, GLenum op )
-{
-    /* can't implement */
-    return GL_FALSE;
-}
-
-
-static void dither( GLcontext* ctx, GLboolean enable )
-{
-    if(enable == GL_FALSE){
-        Current->dither_flag = GL_FALSE;
-        if(Current->cColorBits == 8)
-            Current->pixelformat = PF_INDEX8;
-    }
-    else{
-        if (Current->rgb_flag && Current->cColorBits == 8){
-            Current->pixelformat = PF_DITHER8;
-            Current->dither_flag = GL_TRUE;
-        }
-        else
-            Current->dither_flag = GL_FALSE;
-    }
-}
-
-
-
-static GLboolean set_buffer( GLcontext* ctx, GLenum mode )
-{
-   STARTPROFILE
-   /* TODO: this could be better */
-   if (mode==GL_FRONT || mode==GL_BACK) {
-      return GL_TRUE;
-   }
-   else {
-      return GL_FALSE;
-   }
-   ENDPROFILE(set_buffer)
-}
-
-
-
-/* Return characteristics of the output buffer. */
-static void buffer_size( GLcontext* ctx, GLuint *width, GLuint *height )
-{
-   int New_Size;
-   RECT CR;
-
-   STARTPROFILE
-   GetClientRect(Current->Window,&CR);
-
-   *width=CR.right;
-   *height=CR.bottom;
-
-   New_Size=((*width)!=Current->width) || ((*height)!=Current->height);
-
-   if (New_Size){
-      Current->width=*width;
-      Current->height=*height;
-      Current->ScanWidth=Current->width;
-      if ((Current->ScanWidth%sizeof(long))!=0)
-         Current->ScanWidth+=(sizeof(long)-(Current->ScanWidth%sizeof(long)));
-
-      if (Current->db_flag){
-#ifdef DDRAW
-         DDDeleteOffScreen(Current);
-         DDCreateOffScreen(Current);
-#else
-         if (Current->rgb_flag==GL_TRUE && Current->dither_flag!=GL_TRUE){
-            wmDeleteBackingStore(Current);
-            wmCreateBackingStore(Current, Current->width, Current->height);
-         }
-#endif
-      }
-
-      //  Resize OsmesaBuffer if in Parallel mode
-#if !defined(NO_PARALLEL)
-      if(parallelFlag)
-         PRSizeRenderBuffer(Current->width, Current->height,Current->ScanWidth,
-                            Current->rgb_flag == GL_TRUE ? Current->pbPixels: Current->ScreenMem);
-#endif
-   }
-   ENDPROFILE(buffer_size)
-}
-
-
-
-/**********************************************************************/
-/*****           Accelerated point, line, polygon rendering       *****/
-/**********************************************************************/
-
-
-static void fast_rgb_points( GLcontext* ctx, GLuint first, GLuint last )
-{
-    GLuint i;
-    //  HDC DC=DD_GETDC;
-    PWMC    pwc = Current;
-
-    STARTPROFILE
-
-        if (Current->gl_ctx->VB->MonoColor) {
-            /* all drawn with current color */
-            for (i=first;i<=last;i++) {
-                if (!Current->gl_ctx->VB->ClipMask[i]) {
-                    int x, y;
-                    x =       (GLint) Current->gl_ctx->VB->Win[i][0];
-                    y = FLIP( (GLint) Current->gl_ctx->VB->Win[i][1] );
-                    wmSetPixel(pwc, y,x,GetRValue(Current->pixel),
-                        GetGValue(Current->pixel), GetBValue(Current->pixel));
-                }
-            }
-        }
-        else {
-            /* draw points of different colors */
-            for (i=first;i<=last;i++) {
-                if (!Current->gl_ctx->VB->ClipMask[i]) {
-                    int x, y;
-                    unsigned long pixel=RGB(Current->gl_ctx->VB->Color[i][0]*255.0,
-                        Current->gl_ctx->VB->Color[i][1]*255.0,
-                        Current->gl_ctx->VB->Color[i][2]*255.0);
-                    x =       (GLint) Current->gl_ctx->VB->Win[i][0];
-                    y = FLIP( (GLint) Current->gl_ctx->VB->Win[i][1] );
-                    wmSetPixel(pwc, y,x,Current->gl_ctx->VB->Color[i][0]*255.0,
-                        Current->gl_ctx->VB->Color[i][1]*255.0,
-                        Current->gl_ctx->VB->Color[i][2]*255.0);
-                }
-            }
-        }
-        //   DD_RELEASEDC;
-        ENDPROFILE(fast_rgb_points)
-}
-
-
-
-/* Return pointer to accerated points function */
-extern points_func choose_points_function( GLcontext* ctx )
-{
-    STARTPROFILE
-        if (ctx->Point.Size==1.0 && !ctx->Point.SmoothFlag && ctx->_RasterMask==0
-            && !ctx->Texture.Enabled  && ctx->Visual->RGBAflag) {
-            ENDPROFILE(choose_points_function)
-                return fast_rgb_points;
-        }
-        else {
-            ENDPROFILE(choose_points_function)
-                return NULL;
-        }
-}
-
-
-
-/* Draw a line using the color specified by Current->gl_ctx->VB->Color[pv] */
-static void fast_flat_rgb_line( GLcontext* ctx, GLuint v0, GLuint v1, GLuint pv )
-{
-    STARTPROFILE
-        int x0, y0, x1, y1;
-    unsigned long pixel;
-    HDC DC=DD_GETDC;
-    HPEN Pen;
-    HPEN Old_Pen;
-
-    if (Current->gl_ctx->VB->MonoColor) {
-        pixel = Current->pixel;  /* use current color */
-    }
-    else {
-        pixel = RGB(Current->gl_ctx->VB->Color[pv][0]*255.0, Current->gl_ctx->VB->Color[pv][1]*255.0, Current->gl_ctx->VB->Color[pv][2]*255.0);
-    }
-
-    x0 =       (int) Current->gl_ctx->VB->Win[v0][0];
-    y0 = FLIP( (int) Current->gl_ctx->VB->Win[v0][1] );
-    x1 =       (int) Current->gl_ctx->VB->Win[v1][0];
-    y1 = FLIP( (int) Current->gl_ctx->VB->Win[v1][1] );
-
-
-    BEGINGDICALL
-
-    Pen=CreatePen(PS_SOLID,1,pixel);
-    Old_Pen=SelectObject(DC,Pen);
-    MoveToEx(DC,x0,y0,NULL);
-    LineTo(DC,x1,y1);
-    SelectObject(DC,Old_Pen);
-    DeleteObject(Pen);
-    DD_RELEASEDC;
-
-    ENDGDICALL
-
-    ENDPROFILE(fast_flat_rgb_line)
-}
-
-
-
-/* Return pointer to accerated line function */
-static line_func choose_line_function( GLcontext* ctx )
-{
-    STARTPROFILE
-    if (ctx->Line.Width==1.0 && !ctx->Line.SmoothFlag && !ctx->Line.StippleFlag
-        && ctx->Light.ShadeModel==GL_FLAT && ctx->_RasterMask==0
-        && !ctx->Texture.Enabled && Current->rgb_flag) {
-       ENDPROFILE(choose_line_function)
-       return fast_flat_rgb_line;
-    }
-    else {
-       ENDPROFILE(choose_line_function)
-       return NULL;
-    }
-}
-
-
-/**********************************************************************/
-/*****                 Span-based pixel drawing                   *****/
-/**********************************************************************/
-
-
-/* Write a horizontal span of 32-bit color-index pixels with a boolean mask. */
-static void write_ci32_span( const GLcontext* ctx,
-                             GLuint n, GLint x, GLint y,
-                             const GLuint index[],
-                             const GLubyte mask[] )
-{
-    STARTPROFILE
-    GLuint i;
-    PBYTE Mem=Current->ScreenMem+FLIP(y)*Current->ScanWidth+x;
-    assert(Current->rgb_flag==GL_FALSE);
-    for (i=0; i<n; i++)
-        if (mask[i])
-            Mem[i]=index[i];
-    ENDPROFILE(write_ci32_span)
-}
-
-
-/* Write a horizontal span of 8-bit color-index pixels with a boolean mask. */
-static void write_ci8_span( const GLcontext* ctx,
-                            GLuint n, GLint x, GLint y,
-                            const GLubyte index[],
-                            const GLubyte mask[] )
-{
-    STARTPROFILE
-    GLuint i;
-    PBYTE Mem=Current->ScreenMem+FLIP(y)*Current->ScanWidth+x;
-    assert(Current->rgb_flag==GL_FALSE);
-    for (i=0; i<n; i++)
-        if (mask[i])
-            Mem[i]=index[i];
-    ENDPROFILE(write_ci8_span)
-}
-
-
-
-/*
-* Write a horizontal span of pixels with a boolean mask.  The current
-* color index is used for all pixels.
-*/
-static void write_mono_ci_span(const GLcontext* ctx,
-                               GLuint n,GLint x,GLint y,
-                               const GLubyte mask[])
-{
-   STARTPROFILE
-   GLuint i;
-   BYTE *Mem=Current->ScreenMem+FLIP(y)*Current->ScanWidth+x;
-   assert(Current->rgb_flag==GL_FALSE);
-   for (i=0; i<n; i++)
-      if (mask[i])
-         Mem[i]=Current->pixel;
-   ENDPROFILE(write_mono_ci_span)
-}
-
-/*
- * To improve the performance of this routine, frob the data into an actual
- * scanline and call bitblt on the complete scan line instead of SetPixel.
- */
-
-/* Write a horizontal span of RGBA color pixels with a boolean mask. */
-static void write_rgba_span( const GLcontext* ctx, GLuint n, GLint x, GLint y,
-                             const GLubyte rgba[][4], const GLubyte mask[] )
-{
-    STARTPROFILE
-    PWMC    pwc = Current;
-
-    if (pwc->rgb_flag==GL_TRUE)
-    {
-        GLuint i;
-        HDC DC=DD_GETDC;
-        y=FLIP(y);
-        if (mask) {
-            for (i=0; i<n; i++)
-                if (mask[i])
-                    wmSetPixel(pwc, y, x + i, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
-        }
-        else {
-            for (i=0; i<n; i++)
-                wmSetPixel(pwc, y, x + i, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP] );
-        }
-        DD_RELEASEDC;
-    }
-    else
-    {
-        GLuint i;
-        BYTE *Mem=Current->ScreenMem+y*Current->ScanWidth+x;
-        y = FLIP(y);
-        if (mask) {
-            for (i=0; i<n; i++)
-                if (mask[i])
-                    Mem[i] = GetNearestPaletteIndex(Current->hPal,RGB(rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]));
-        }
-        else {
-            for (i=0; i<n; i++)
-                Mem[i] = GetNearestPaletteIndex(Current->hPal,RGB(rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]));
-        }
-    }
-    ENDPROFILE(write_rgba_span)
-
-}
-
-/* Write a horizontal span of RGB color pixels with a boolean mask. */
-static void write_rgb_span( const GLcontext* ctx,
-                            GLuint n, GLint x, GLint y,
-                            const GLubyte rgb[][3], const GLubyte mask[] )
-{
-    STARTPROFILE
-    PWMC    pwc = Current;
-
-    if (pwc->rgb_flag==GL_TRUE)
-    {
-        GLuint i;
-        HDC DC=DD_GETDC;
-        y=FLIP(y);
-        if (mask) {
-            for (i=0; i<n; i++)
-                if (mask[i])
-                    wmSetPixel(pwc, y, x + i, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]);
-        }
-        else {
-            for (i=0; i<n; i++)
-                wmSetPixel(pwc, y, x + i, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP] );
-        }
-        DD_RELEASEDC;
-    }
-    else
-    {
-        GLuint i;
-        BYTE *Mem=Current->ScreenMem+y*Current->ScanWidth+x;
-        y = FLIP(y);
-        if (mask) {
-            for (i=0; i<n; i++)
-                if (mask[i])
-                    Mem[i] = GetNearestPaletteIndex(Current->hPal,RGB(rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]));
-        }
-        else {
-            for (i=0; i<n; i++)
-                Mem[i] = GetNearestPaletteIndex(Current->hPal,RGB(rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]));
-        }
-    }
-    ENDPROFILE(write_rgb_span)
-
-}
-
-/*
-* Write a horizontal span of pixels with a boolean mask.  The current color
-* is used for all pixels.
-*/
-static void write_mono_rgba_span( const GLcontext* ctx,
-                                  GLuint n, GLint x, GLint y,
-                                  const GLubyte mask[])
-{
-    STARTPROFILE
-    GLuint i;
-    HDC DC=DD_GETDC;
-    PWMC pwc = Current;
-    assert(Current->rgb_flag==GL_TRUE);
-    y=FLIP(y);
-    if(Current->rgb_flag==GL_TRUE){
-        for (i=0; i<n; i++)
-            if (mask[i])
-                // Trying
-                wmSetPixel(pwc,y,x+i,GetRValue(Current->pixel), GetGValue(Current->pixel), GetBValue(Current->pixel));
-    }
-    else {
-        for (i=0; i<n; i++)
-            if (mask[i])
-                SetPixel(DC, y, x+i, Current->pixel);
-    }
-    DD_RELEASEDC;
-    ENDPROFILE(write_mono_rgba_span)
-}
-
-
-
-/**********************************************************************/
-/*****                   Array-based pixel drawing                *****/
-/**********************************************************************/
-
-
-/* Write an array of 32-bit index pixels with a boolean mask. */
-static void write_ci32_pixels( const GLcontext* ctx,
-                               GLuint n, const GLint x[], const GLint y[],
-                               const GLuint index[], const GLubyte mask[] )
-{
-   STARTPROFILE
-   GLuint i;
-   assert(Current->rgb_flag==GL_FALSE);
-   for (i=0; i<n; i++) {
-      if (mask[i]) {
-         BYTE *Mem=Current->ScreenMem+FLIP(y[i])*Current->ScanWidth+x[i];
-         *Mem = index[i];
-      }
-   }
-   ENDPROFILE(write_ci32_pixels)
-}
-
-
-
-/*
-* Write an array of pixels with a boolean mask.  The current color
-* index is used for all pixels.
-*/
-static void write_mono_ci_pixels( const GLcontext* ctx,
-                                  GLuint n,
-                                  const GLint x[], const GLint y[],
-                                  const GLubyte mask[] )
-{
-   STARTPROFILE
-   GLuint i;
-   assert(Current->rgb_flag==GL_FALSE);
-   for (i=0; i<n; i++) {
-      if (mask[i]) {
-         BYTE *Mem=Current->ScreenMem+FLIP(y[i])*Current->ScanWidth+x[i];
-         *Mem = Current->pixel;
-      }
-   }
-   ENDPROFILE(write_mono_ci_pixels)
-}
-
-
-
-/* Write an array of RGBA pixels with a boolean mask. */
-static void write_rgba_pixels( const GLcontext* ctx,
-                               GLuint n, const GLint x[], const GLint y[],
-                               const GLubyte rgba[][4], const GLubyte mask[] )
-{
-    STARTPROFILE
-        GLuint i;
-    PWMC    pwc = Current;
-    HDC DC=DD_GETDC;
-    assert(Current->rgb_flag==GL_TRUE);
-    for (i=0; i<n; i++)
-       if (mask[i])
-          wmSetPixel(pwc, FLIP(y[i]),x[i],rgba[i][RCOMP],rgba[i][GCOMP],rgba[i][BCOMP]);
-    DD_RELEASEDC;
-    ENDPROFILE(write_rgba_pixels)
-}
-
-
-
-/*
-* Write an array of pixels with a boolean mask.  The current color
-* is used for all pixels.
-*/
-static void write_mono_rgba_pixels( const GLcontext* ctx,
-                                    GLuint n,
-                                    const GLint x[], const GLint y[],
-                                    const GLubyte mask[] )
-{
-    STARTPROFILE
-    GLuint i;
-    PWMC    pwc = Current;
-    HDC DC=DD_GETDC;
-    assert(Current->rgb_flag==GL_TRUE);
-    for (i=0; i<n; i++)
-        if (mask[i])
-            wmSetPixel(pwc, FLIP(y[i]),x[i],GetRValue(Current->pixel),
-                       GetGValue(Current->pixel), GetBValue(Current->pixel));
-    DD_RELEASEDC;
-    ENDPROFILE(write_mono_rgba_pixels)
-}
-
-
-
-/**********************************************************************/
-/*****            Read spans/arrays of pixels                     *****/
-/**********************************************************************/
-
-
-/* Read a horizontal span of color-index pixels. */
-static void read_ci32_span( const GLcontext* ctx, GLuint n, GLint x, GLint y,
-                            GLuint index[])
-{
-   STARTPROFILE
-   GLuint i;
-   BYTE *Mem=Current->ScreenMem+FLIP(y)*Current->ScanWidth+x;
-   assert(Current->rgb_flag==GL_FALSE);
-   for (i=0; i<n; i++)
-      index[i]=Mem[i];
-   ENDPROFILE(read_ci32_span)
-}
-
-
-
-
-/* Read an array of color index pixels. */
-static void read_ci32_pixels( const GLcontext* ctx,
-                              GLuint n, const GLint x[], const GLint y[],
-                              GLuint indx[], const GLubyte mask[] )
-{
-   STARTPROFILE
-   GLuint i;
-   assert(Current->rgb_flag==GL_FALSE);
-   for (i=0; i<n; i++) {
-      if (mask[i]) {
-         indx[i]=*(Current->ScreenMem+FLIP(y[i])*Current->ScanWidth+x[i]);
-      }
-   }
-   ENDPROFILE(read_ci32_pixels)
-}
-
-
-
-/* Read a horizontal span of color pixels. */
-static void read_rgba_span( const GLcontext* ctx,
-                            GLuint n, GLint x, GLint y,
-                            GLubyte rgba[][4] )
-{
-   STARTPROFILE
-   UINT i;
-   COLORREF Color;
-   HDC DC=DD_GETDC;
-   assert(Current->rgb_flag==GL_TRUE);
-   y=FLIP(y);
-   for (i=0; i<n; i++) {
-      Color=GetPixel(DC,x+i,y);
-      rgba[i][RCOMP] = GetRValue(Color);
-      rgba[i][GCOMP] = GetGValue(Color);
-      rgba[i][BCOMP] = GetBValue(Color);
-      rgba[i][ACOMP] = 255;
-   }
-   DD_RELEASEDC;
-// Brian P. Has mentioned to comment this out.
-//   memset(alpha,0,n*sizeof(GLubyte));
-   ENDPROFILE(read_rgba_span)
-}
-
-
-/* Read an array of color pixels. */
-static void read_rgba_pixels( const GLcontext* ctx,
-                              GLuint n, const GLint x[], const GLint y[],
-                              GLubyte rgba[][4], const GLubyte mask[] )
-{
-   STARTPROFILE
-   GLuint i;
-   COLORREF Color;
-   HDC DC=DD_GETDC;
-   assert(Current->rgb_flag==GL_TRUE);
-   for (i=0; i<n; i++) {
-      if (mask[i]) {
-         Color=GetPixel(DC,x[i],FLIP(y[i]));
-         rgba[i][RCOMP] = GetRValue(Color);
-         rgba[i][GCOMP] = GetGValue(Color);
-         rgba[i][BCOMP] = GetBValue(Color);
-         rgba[i][ACOMP] = 255;
-      }
-   }
-   DD_RELEASEDC;
-// Brian P. has mentioned to comment this out.
-//   memset(alpha,0,n*sizeof(GLint));
-   ENDPROFILE(read_rgba_pixels)
-}
-
-
-
-/**********************************************************************/
-/**********************************************************************/
-
-
-static const char *renderer_string(void)
-{
-   return "Windows";
-}
-
-
-
-void setup_DD_pointers( GLcontext* ctx )
-{
-    ctx->Driver.RendererString = renderer_string;
-    ctx->Driver.UpdateState = setup_DD_pointers;
-    ctx->Driver.GetBufferSize = buffer_size;
-    ctx->Driver.Finish = finish;
-    ctx->Driver.Flush = flush;
-
-    ctx->Driver.ClearIndex = clear_index;
-    ctx->Driver.ClearColor = clear_color;
-    ctx->Driver.Clear = clear;
-
-    ctx->Driver.Index = set_index;
-    ctx->Driver.Color = set_color;
-    ctx->Driver.IndexMask = index_mask;
-    ctx->Driver.ColorMask = color_mask;
-
-    ctx->Driver.LogicOp = logicop;
-    ctx->Driver.Dither = dither;
-
-    ctx->Driver.SetBuffer = set_buffer;
-    ctx->Driver.GetBufferSize = buffer_size;
-
-    ctx->Driver.PointsFunc = choose_points_function(ctx);
-    ctx->Driver.LineFunc = choose_line_function(ctx);
-    ctx->Driver.TriangleFunc = choose_triangle_function( ctx );
-
-    /* Pixel/span writing functions: */
-       ctx->Driver.WriteRGBASpan        = write_rgba_span;
-    ctx->Driver.WriteRGBSpan         = write_rgb_span;
-    ctx->Driver.WriteMonoRGBASpan    = write_mono_rgba_span;
-    ctx->Driver.WriteRGBAPixels      = write_rgba_pixels;
-    ctx->Driver.WriteMonoRGBAPixels  = write_mono_rgba_pixels;
-    ctx->Driver.WriteCI32Span        = write_ci32_span;
-    ctx->Driver.WriteCI8Span         = write_ci8_span;
-    ctx->Driver.WriteMonoCISpan      = write_mono_ci_span;
-    ctx->Driver.WriteCI32Pixels      = write_ci32_pixels;
-    ctx->Driver.WriteMonoCIPixels    = write_mono_ci_pixels;
-
-    ctx->Driver.ReadCI32Span        = read_ci32_span;
-    ctx->Driver.ReadRGBASpan        = read_rgba_span;
-    ctx->Driver.ReadCI32Pixels      = read_ci32_pixels;
-    ctx->Driver.ReadRGBAPixels      = read_rgba_pixels;
-}
-
-
-/**********************************************************************/
-/*****                  WMesa API Functions                       *****/
-/**********************************************************************/
-
-
-
-#define PAL_SIZE 256
-static void GetPalette(HPALETTE Pal,RGBQUAD *aRGB)
-{
-    STARTPROFILE
-        int i;
-    HDC hdc;
-    struct
-    {
-        WORD Version;
-        WORD NumberOfEntries;
-        PALETTEENTRY aEntries[PAL_SIZE];
-    } Palette =
-    {
-        0x300,
-            PAL_SIZE
-    };
-    hdc=GetDC(NULL);
-    if (Pal!=NULL)
-        GetPaletteEntries(Pal,0,PAL_SIZE,Palette.aEntries);
-    else
-        GetSystemPaletteEntries(hdc,0,PAL_SIZE,Palette.aEntries);
-    if (GetSystemPaletteUse(hdc) == SYSPAL_NOSTATIC)
-    {
-        for(i = 0; i <PAL_SIZE; i++)
-            Palette.aEntries[i].peFlags = PC_RESERVED;
-        Palette.aEntries[255].peRed = 255;
-        Palette.aEntries[255].peGreen = 255;
-        Palette.aEntries[255].peBlue = 255;
-        Palette.aEntries[255].peFlags = 0;
-        Palette.aEntries[0].peRed = 0;
-        Palette.aEntries[0].peGreen = 0;
-        Palette.aEntries[0].peBlue = 0;
-        Palette.aEntries[0].peFlags = 0;
-    }
-    else
-    {
-        int nStaticColors;
-        int nUsableColors;
-        nStaticColors = GetDeviceCaps(hdc, NUMCOLORS)/2;
-        for (i=0; i<nStaticColors; i++)
-            Palette.aEntries[i].peFlags = 0;
-        nUsableColors = PAL_SIZE-nStaticColors;
-        for (; i<nUsableColors; i++)
-            Palette.aEntries[i].peFlags = PC_RESERVED;
-        for (; i<PAL_SIZE-nStaticColors; i++)
-            Palette.aEntries[i].peFlags = PC_RESERVED;
-        for (i=PAL_SIZE-nStaticColors; i<PAL_SIZE; i++)
-            Palette.aEntries[i].peFlags = 0;
-    }
-    ReleaseDC(NULL,hdc);
-    for (i=0; i<PAL_SIZE; i++)
-    {
-        aRGB[i].rgbRed=Palette.aEntries[i].peRed;
-        aRGB[i].rgbGreen=Palette.aEntries[i].peGreen;
-        aRGB[i].rgbBlue=Palette.aEntries[i].peBlue;
-        aRGB[i].rgbReserved=Palette.aEntries[i].peFlags;
-    }
-    ENDPROFILE(GetPalette)
-}
-
-
-WMesaContext WMesaCreateContext( HWND hWnd,
-                                                                                       HPALETTE* Pal,
-                                                                                       GLboolean rgb_flag,
-                                                                                       GLboolean db_flag )
-{
-    RECT CR;
-    WMesaContext c;
-    GLboolean true_color_flag;
-    c = (struct wmesa_context * ) calloc(1,sizeof(struct wmesa_context));
-    if (!c)
-        return NULL;
-
-    c->Window=hWnd;
-    c->hDC = GetDC(hWnd);
-    true_color_flag = GetDeviceCaps(c->hDC, BITSPIXEL) > 8;
-#ifdef DDRAW
-    if(true_color_flag) c->rgb_flag = rgb_flag = GL_TRUE;
-#endif
-
-
-#ifdef DITHER
-    if ((true_color_flag==GL_FALSE) && (rgb_flag == GL_TRUE)){
-        c->dither_flag = GL_TRUE;
-        c->hPalHalfTone = WinGCreateHalftonePalette();
-    }
-    else
-        c->dither_flag = GL_FALSE;
-#else
-    c->dither_flag = GL_FALSE;
-#endif
-
-
-    if (rgb_flag==GL_FALSE)
-    {
-        c->rgb_flag = GL_FALSE;
-        //    c->pixel = 1;
-        c->db_flag = db_flag =GL_TRUE; // WinG requires double buffering
-        printf("Single buffer is not supported in color index mode, setting to double buffer.\n");
-    }
-    else
-    {
-        c->rgb_flag = GL_TRUE;
-        //    c->pixel = 0;
-    }
-    GetClientRect(c->Window,&CR);
-    c->width=CR.right;
-    c->height=CR.bottom;
-    if (db_flag)
-    {
-        c->db_flag = 1;
-        /* Double buffered */
-#ifndef DDRAW
-        //  if (c->rgb_flag==GL_TRUE && c->dither_flag != GL_TRUE )
-        {
-            wmCreateBackingStore(c, c->width, c->height);
-
-        }
-#endif
-    }
-    else
-    {
-        /* Single Buffered */
-        if (c->rgb_flag)
-            c->db_flag = 0;
-    }
-#ifdef DDRAW
-    if (DDInit(c,hWnd) == GL_FALSE) {
-        free( (void *) c );
-        exit(1);
-    }
-#endif
-
-
-    c->gl_visual = gl_create_visual(rgb_flag,
-                                    GL_FALSE,   /* software alpha */
-                                    db_flag,    /* db_flag */
-                                    GL_FALSE,   /* stereo */
-                                    16,         /* depth_bits */
-                                    8,          /* stencil_bits */
-                                    8,          /* accum_bits */
-                                    0,          /* index bits */
-                                    8,8,8,8 );  /* r, g, b, a bits */
-
-    if (!c->gl_visual) {
-        return NULL;
-    }
-
-    /* allocate a new Mesa context */
-    c->gl_ctx = gl_create_context( c->gl_visual, NULL, c, GL_TRUE);
-
-    if (!c->gl_ctx) {
-        gl_destroy_visual( c->gl_visual );
-        free(c);
-        return NULL;
-    }
-
-    c->gl_buffer = gl_create_framebuffer( c->gl_visual );
-    if (!c->gl_buffer) {
-        gl_destroy_visual( c->gl_visual );
-        gl_destroy_context( c->gl_ctx );
-        free(c);
-        return NULL;
-    }\r
-\r
-       c->gl_ctx->Driver.UpdateState = setup_DD_pointers;\r
-
-    //  setup_DD_pointers(c->gl_ctx);
-
-    return c;
-}
-
-void WMesaDestroyContext( void )
-{
-    WMesaContext c = Current;
-    ReleaseDC(c->Window,c->hDC);
-    WC = c;
-    if(c->hPalHalfTone != NULL)
-        DeleteObject(c->hPalHalfTone);
-    gl_destroy_visual( c->gl_visual );
-    gl_destroy_framebuffer( c->gl_buffer );
-    gl_destroy_context( c->gl_ctx );
-
-    if (c->db_flag)
-#ifdef DDRAW
-        DDFree(c);
-#else
-    wmDeleteBackingStore(c);
-#endif
-    free( (void *) c );
-    //Following code is added to enable parallel render
-    // Parallel render only work in double buffer mode
-#if !defined(NO_PARALLEL)
-    if(parallelMachine)
-        PRDestroyRenderBuffer();
-#endif
-    // End modification
-}
-
-void WMesaMakeCurrent( WMesaContext c )
-{
-    if(!c){
-        Current = c;
-        return;
-    }
-
-    //
-    // A little optimization
-    // If it already is current,
-    // don't set it again
-    //
-    if(Current == c)
-        return;
-
-    //gl_set_context( c->gl_ctx );
-    gl_make_current(c->gl_ctx, c->gl_buffer);
-    setup_DD_pointers(c->gl_ctx);\r
-    Current = c;
-    if (Current->gl_ctx->Viewport.Width==0) {
-        /* initialize viewport to window size */
-        _mesa_set_viewport( Current->gl_ctx,
-            0, 0, Current->width, Current->height );
-    }
-    if ((c->cColorBits <= 8 ) && (c->rgb_flag == GL_TRUE)){
-        WMesaPaletteChange(c->hPalHalfTone);
-    }
-}
-
-void  WMesaSwapBuffers( void )
-{
-    HDC DC = Current->hDC;
-    if (Current->db_flag)
-        wmFlush(Current);
-}
-
-void  WMesaPaletteChange(HPALETTE Pal)
-{
-    int vRet;
-    LPPALETTEENTRY pPal;
-    if (Current && (Current->rgb_flag==GL_FALSE || Current->dither_flag == GL_TRUE))
-    {
-        pPal = (PALETTEENTRY *)malloc( 256 * sizeof(PALETTEENTRY));
-        Current->hPal=Pal;
-        //  GetPaletteEntries( Pal, 0, 256, pPal );
-        GetPalette( Pal, pPal );
-#ifdef DDRAW
-        Current->lpDD->lpVtbl->CreatePalette(Current->lpDD,DDPCAPS_8BIT,
-            pPal, &(Current->lpDDPal), NULL);
-        if (Current->lpDDPal)
-            Current->lpDDSPrimary->lpVtbl->SetPalette(Current->lpDDSPrimary,Current->lpDDPal);
-#else
-        vRet = SetDIBColorTable(Current->dib.hDC,0,256,pPal);
-#endif
-        free( pPal );
-    }
-
-}
-
-static unsigned char threeto8[8] = {
-    0, 0111>>1, 0222>>1, 0333>>1, 0444>>1, 0555>>1, 0666>>1, 0377
-};
-
-static unsigned char twoto8[4] = {
-    0, 0x55, 0xaa, 0xff
-};
-
-static unsigned char oneto8[2] = {
-    0, 255
-};
-
-static unsigned char componentFromIndex(UCHAR i, UINT nbits, UINT shift)
-{
-    unsigned char val;
-
-    val = i >> shift;
-    switch (nbits) {
-
-    case 1:
-        val &= 0x1;
-        return oneto8[val];
-
-    case 2:
-        val &= 0x3;
-        return twoto8[val];
-
-    case 3:
-        val &= 0x7;
-        return threeto8[val];
-
-    default:
-        return 0;
-    }
-}
-
-void wmCreatePalette( PWMC pwdc )
-{
-    /* Create a compressed and re-expanded 3:3:2 palette */
-    int            i;
-    LOGPALETTE     *pPal;
-    BYTE           rb, rs, gb, gs, bb, bs;
-
-    pwdc->nColors = 0x100;
-
-    pPal = (PLOGPALETTE)malloc(sizeof(LOGPALETTE) + pwdc->nColors * sizeof(PALETTEENTRY));
-    memset( pPal, 0, sizeof(LOGPALETTE) + pwdc->nColors * sizeof(PALETTEENTRY) );
-
-    pPal->palVersion = 0x300;
-
-    rb = REDBITS;
-    rs = REDSHIFT;
-    gb = GREENBITS;
-    gs = GREENSHIFT;
-    bb = BLUEBITS;
-    bs = BLUESHIFT;
-
-    if (pwdc->db_flag) {
-
-        /* Need to make two palettes: one for the screen DC and one for the DIB. */
-        pPal->palNumEntries = pwdc->nColors;
-        for (i = 0; i < pwdc->nColors; i++) {
-            pPal->palPalEntry[i].peRed = componentFromIndex( i, rb, rs );
-            pPal->palPalEntry[i].peGreen = componentFromIndex( i, gb, gs );
-            pPal->palPalEntry[i].peBlue = componentFromIndex( i, bb, bs );
-            pPal->palPalEntry[i].peFlags = 0;
-        }
-        pwdc->hGLPalette = CreatePalette( pPal );
-        pwdc->hPalette = CreatePalette( pPal );
-    }
-
-    else {
-        pPal->palNumEntries = pwdc->nColors;
-        for (i = 0; i < pwdc->nColors; i++) {
-            pPal->palPalEntry[i].peRed = componentFromIndex( i, rb, rs );
-            pPal->palPalEntry[i].peGreen = componentFromIndex( i, gb, gs );
-            pPal->palPalEntry[i].peBlue = componentFromIndex( i, bb, bs );
-            pPal->palPalEntry[i].peFlags = 0;
-        }
-        pwdc->hGLPalette = CreatePalette( pPal );
-    }
-
-    free(pPal);
-
-}
-
-void wmSetPixel(PWMC pwc, int iScanLine, int iPixel, BYTE r, BYTE g, BYTE b)
-{
-    if(Current->db_flag){
-        LPBYTE  lpb = pwc->pbPixels;
-        LPDWORD lpdw;
-        LPWORD  lpw;
-        UINT    nBypp = pwc->cColorBits / 8;
-        UINT    nOffset = iPixel % nBypp;
-
-        // Move the pixel buffer pointer to the scanline that we
-        // want to access
-
-        //      pwc->dib.fFlushed = FALSE;
-
-        lpb += pwc->ScanWidth * iScanLine;
-        // Now move to the desired pixel
-        lpb += iPixel * nBypp;
-        lpb = PIXELADDR(iPixel, iScanLine);
-        lpdw = (LPDWORD)lpb;
-        lpw = (LPWORD)lpb;
-
-        if(nBypp == 1){
-            if(pwc->dither_flag)
-                *lpb = DITHER_RGB_2_8BIT(r,g,b,iScanLine,iPixel);
-            else
-                *lpb = BGR8(r,g,b);
-        }
-        else if(nBypp == 2)
-            *lpw = BGR16(r,g,b);
-        else if (nBypp == 3){
-            *lpdw = BGR24(r,g,b);
-        }
-        else if (nBypp == 4)
-            *lpdw = BGR32(r,g,b);
-    }
-    else{
-        HDC DC = DD_GETDC;
-        SetPixel(DC, iPixel, iScanLine, RGB(r,g,b));
-        DD_RELEASEDC;
-    }
-}
-
-void wmCreateDIBSection( HDC   hDC,
-                                                PWMC pwc,    // handle of device context
-                                                CONST BITMAPINFO *pbmi,  // address of structure containing bitmap size, format, and color data
-                                                UINT iUsage  // color data type indicator: RGB values or palette indices
-                       )
-{
-    DWORD   dwSize = 0;
-    DWORD   dwScanWidth;
-    UINT    nBypp = pwc->cColorBits / 8;
-    HDC     hic;
-
-    dwScanWidth = (((pwc->ScanWidth * nBypp)+ 3) & ~3);
-
-    pwc->ScanWidth =pwc->pitch = dwScanWidth;
-
-    if (stereo_flag)
-        pwc->ScanWidth = 2* pwc->pitch;
-
-    dwSize = sizeof(BITMAPINFO) + (dwScanWidth * pwc->height);
-
-    pwc->dib.hFileMap = CreateFileMapping((HANDLE)PAGE_FILE,
-        NULL,
-        PAGE_READWRITE | SEC_COMMIT,
-        0,
-        dwSize,
-        NULL);
-
-    if (!pwc->dib.hFileMap)
-        return;
-
-    pwc->dib.base = MapViewOfFile(pwc->dib.hFileMap,
-        FILE_MAP_ALL_ACCESS,
-        0,
-        0,
-        0);
-
-    if(!pwc->dib.base){
-        CloseHandle(pwc->dib.hFileMap);
-        return;
-    }
-
-    //  pwc->pbPixels = pwc->addrOffScreen = ((LPBYTE)pwc->dib.base) + sizeof(BITMAPINFO);
-
-    //  pwc->dib.hDC = CreateCompatibleDC(hDC);
-
-    CopyMemory(pwc->dib.base, pbmi, sizeof(BITMAPINFO));
-
-    hic = CreateIC("display", NULL, NULL, NULL);
-    pwc->dib.hDC = CreateCompatibleDC(hic);
-
-
-    /*  pwc->hbmDIB = CreateDIBitmap(hic,
-    &(pwc->bmi.bmiHeader),
-    CBM_INIT,
-    pwc->pbPixels,
-    &(pwc->bmi),
-    DIB_RGB_COLORS);
-    */
-    pwc->hbmDIB = CreateDIBSection(hic,
-        &(pwc->bmi),
-        (iUsage ? DIB_PAL_COLORS : DIB_RGB_COLORS),
-        &(pwc->pbPixels),
-        pwc->dib.hFileMap,
-        0);
-        /*
-        pwc->hbmDIB = CreateDIBSection(hic,
-        &(pwc->bmi),
-        DIB_RGB_COLORS,
-        &(pwc->pbPixels),
-        pwc->dib.hFileMap,
-        0);
-    */
-    pwc->ScreenMem = pwc->addrOffScreen = pwc->pbPixels;
-    pwc->hOldBitmap = SelectObject(pwc->dib.hDC, pwc->hbmDIB);
-
-    DeleteDC(hic);
-
-    return;
-
-}
-
-//
-// Blit memory DC to screen DC
-//
-BOOL wmFlush(PWMC pwc)
-{
-    BOOL    bRet = 0;
-    DWORD   dwErr = 0;
-#ifdef DDRAW
-    HRESULT             ddrval;
-#endif
-
-    // Now search through the torus frames and mark used colors
-    if(pwc->db_flag){
-#ifdef DDRAW
-        if (pwc->lpDDSOffScreen == NULL)
-            if(DDCreateOffScreen(pwc) == GL_FALSE)
-                return;
-
-            pwc->lpDDSOffScreen->lpVtbl->Unlock(pwc->lpDDSOffScreen, NULL);
-
-            while( 1 )
-            {
-                ddrval = pwc->lpDDSPrimary->lpVtbl->Blt( pwc->lpDDSPrimary,
-                    &(pwc->rectSurface), pwc->lpDDSOffScreen, &(pwc->rectOffScreen), 0, NULL );
-
-                if( ddrval == DD_OK )
-                {
-                    break;
-                }
-                if( ddrval == DDERR_SURFACELOST )
-                {
-                    if(!DDRestoreAll(pwc))
-                    {
-                        break;
-                    }
-                }
-                if( ddrval != DDERR_WASSTILLDRAWING )
-                {
-                    break;
-                }
-            }
-
-            while (pwc->lpDDSOffScreen->lpVtbl->Lock(pwc->lpDDSOffScreen,
-                NULL, &(pwc->ddsd), 0, NULL) == DDERR_WASSTILLDRAWING)
-                ;
-
-            if(ddrval != DD_OK)
-                dwErr = GetLastError();
-#else
-            bRet = BitBlt(pwc->hDC, 0, 0, pwc->width, pwc->height,
-                pwc->dib.hDC, 0, 0, SRCCOPY);
-#endif
-    }
-
-    return(TRUE);
-
-}
-
-// The following code is added by Li Wei to enable stereo display
-
-#if !defined(NO_STEREO)
-
-void WMesaShowStereo(GLuint list)
-{
-
-    GLbitfield mask = GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT;
-    GLfloat cm[16];
-    GLint matrix_mode;
-    // Must use double Buffer
-    if( ! Current-> db_flag )
-        return;
-
-
-    glGetIntegerv(GL_MATRIX_MODE,&matrix_mode);
-
-    //  glPushMatrix();  //****
-    WMesaViewport(Current->gl_ctx,0,Current->height/2,Current->width,Current->height/2);
-    //  Current->gl_ctx->NewState = 0;
-
-    //  glViewport(0,0,Current->width,Current->height/2);
-    if(matrix_mode!=GL_MODELVIEW)
-        glMatrixMode(GL_MODELVIEW);
-
-    glGetFloatv(GL_MODELVIEW_MATRIX,cm);
-    glLoadIdentity();
-    gluLookAt(viewDistance/2,0.0,0.0 ,
-        viewDistance/2,0.0,-1.0,
-        0.0,1.0,0.0 );
-    //  glTranslatef(viewDistance/2.0,0.,0.);
-    glMultMatrixf( cm );
-
-    Current->ScreenMem = Current->pbPixels = Current->addrOffScreen;
-    //glPushMatrix();
-    glCallList( list );
-    //glPopMatrix();
-
-    glGetFloatv(GL_MODELVIEW_MATRIX,cm);
-    glLoadIdentity();
-    gluLookAt(-viewDistance/2,0.0,0.0 ,
-        -viewDistance/2,0.0,-1.0,
-        0.0,1.0,0.0 );
-    //  glTranslatef(-viewDistance/2.0,0.,0.);
-    glMultMatrixf(cm);
-
-    Current->ScreenMem = Current->pbPixels = Current->addrOffScreen + Current->pitch;
-    glCallList(list);
-    if(matrix_mode!=GL_MODELVIEW)
-        glMatrixMode(matrix_mode);
-
-    //  glPopMatrix();
-    glFlush();
-
-    WMesaViewport(Current->gl_ctx,0,0,Current->width,Current->height);
-    //  Current->gl_ctx->NewState = 0;
-    WMesaSwapBuffers();
-
-}
-
-void toggleStereoMode()
-{
-    if(!Current->db_flag)
-        return;
-    if(!stereo_flag){
-        stereo_flag = 1;
-        if(stereoBuffer==GL_FALSE)
-#if !defined(NO_PARALLEL)
-            if(!parallelFlag)
-#endif
-            {
-                Current->ScanWidth = Current->pitch*2;
-            }
-    }
-    else {
-        stereo_flag = 0;
-#if !defined(NO_PARALLEL)
-        if(!parallelFlag)
-#endif
-            Current->ScanWidth = Current->pitch;
-        Current->pbPixels = Current->addrOffScreen;
-    }
-}
-
-/* if in stereo mode, the following function is called */
-void glShowStereo(GLuint list)
-{
-    WMesaShowStereo(list);
-}
-
-#endif // End if NO_STEREO not defined
-
-#if !defined(NO_PARALLEL)
-
-void toggleParallelMode(void)
-{
-    if(!parallelFlag){
-        parallelFlag = GL_TRUE;
-        if(parallelMachine==GL_FALSE){
-            PRCreateRenderBuffer( Current->rgb_flag? GL_RGBA :GL_COLOR_INDEX,
-                Current->cColorBits/8,
-                Current->width ,Current->height,
-                Current->ScanWidth,
-                Current->rgb_flag? Current->pbPixels: Current->ScreenMem);
-            parallelMachine = GL_TRUE;
-        }
-    }
-    else {
-        parallelFlag = GL_FALSE;
-        if(parallelMachine==GL_TRUE){
-            PRDestroyRenderBuffer();
-            parallelMachine=GL_FALSE;
-            ReadyForNextFrame = GL_TRUE;
-        }
-
-        /***********************************************
-        // Seems something wrong!!!!
-        ************************************************/
-
-        WMesaMakeCurrent(Current);
-#if !defined(NO_STEREO)
-        stereo_flag = GL_FALSE ;
-#endif
-    }
-}
-
-void PRShowRenderResult(void)
-{
-    int flag = 0;
-    if(!glImageRendered())
-        return;
-
-    if (parallelFlag)
-    {
-        WMesaSwapBuffers();
-    }
-
-}
-#endif //End if NO_PARALLEL not defined
-
-//end modification
-
-BYTE DITHER_RGB_2_8BIT( int red, int green, int blue, int pixel, int scanline)
-{
-    char unsigned redtemp, greentemp, bluetemp, paletteindex;
-
-    //*** now, look up each value in the halftone matrix
-    //*** using an 8x8 ordered dither.
-    redtemp = aDividedBy51[red]
-        + (aModulo51[red] > aHalftone8x8[(pixel%8)*8
-        + scanline%8]);
-    greentemp = aDividedBy51[(char unsigned)green]
-        + (aModulo51[green] > aHalftone8x8[
-        (pixel%8)*8 + scanline%8]);
-    bluetemp = aDividedBy51[(char unsigned)blue]
-        + (aModulo51[blue] > aHalftone8x8[
-        (pixel%8)*8 +scanline%8]);
-
-    //*** recombine the halftoned rgb values into a palette index
-    paletteindex =
-        redtemp + aTimes6[greentemp] + aTimes36[bluetemp];
-
-    //*** and translate through the wing halftone palette
-    //*** translation vector to give the correct value.
-    return aWinGHalftoneTranslation[paletteindex];
-}
-
-#ifdef DDRAW
-/*
-* restoreAll
-*
-* restore all lost objects
-*/
-static HRESULT DDRestoreAll( WMesaContext wc )
-{
-    HRESULT     ddrval;
-
-    ddrval = wc->lpDDSPrimary->lpVtbl->Restore(wc->lpDDSPrimary);
-    if( ddrval == DD_OK )
-    {
-        ddrval = wc->lpDDSOffScreen->lpVtbl->Restore(wc->lpDDSOffScreen);
-    }
-    return ddrval;
-
-} /* restoreAll */
-
-
-  /*
-  * This function is called if the initialization function fails
-*/
-static BOOL initFail( HWND hwnd, WMesaContext wc )
-{
-    DDFree(wc);
-    MessageBox( hwnd, "DirectDraw Init FAILED", "", MB_OK );
-    return FALSE;
-
-} /* initFail */
-
-
-static void DDDeleteOffScreen(WMesaContext wc)
-{
-    if( wc->lpDDSOffScreen != NULL )
-    {
-        wc->lpDDSOffScreen->lpVtbl->Unlock(wc->lpDDSOffScreen,NULL);
-        wc->lpDDSOffScreen->lpVtbl->Release(wc->lpDDSOffScreen);
-        wc->lpDDSOffScreen = NULL;
-    }
-
-}
-
-static void DDFreePrimarySurface(WMesaContext wc)
-{
-    if( wc->lpDDSPrimary != NULL )
-    {
-        if(wc->db_flag == GL_FALSE)
-            wc->lpDDSPrimary->lpVtbl->ReleaseDC(wc->lpDDSPrimary, wc->hDC);
-        wc->lpDDSPrimary->lpVtbl->Release(wc->lpDDSPrimary);
-        wc->lpDDSPrimary = NULL;
-    }
-}
-
-static BOOL DDCreatePrimarySurface(WMesaContext wc)
-{
-    HRESULT ddrval;
-    DDSCAPS             ddscaps;
-    wc->ddsd.dwSize = sizeof( wc->ddsd );
-    wc->ddsd.dwFlags = DDSD_CAPS;
-    wc->ddsd.ddsCaps.dwCaps =   DDSCAPS_PRIMARYSURFACE;
-
-    ddrval = wc->lpDD->lpVtbl->CreateSurface( wc->lpDD,&(wc->ddsd), &(wc->lpDDSPrimary), NULL );
-    if( ddrval != DD_OK )
-    {
-        return initFail(wc->hwnd , wc);
-    }
-    if(wc->db_flag == GL_FALSE)
-        wc->lpDDSPrimary->lpVtbl->GetDC(wc->lpDDSPrimary, wc->hDC);
-    return TRUE;
-}
-
-static BOOL DDCreateOffScreen(WMesaContext wc)
-{
-    POINT   pt;
-    HRESULT     ddrval;
-    if(wc->lpDD == NULL)
-        return FALSE;
-    GetClientRect( wc->hwnd, &(wc->rectOffScreen) );
-    wc->ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
-    wc->ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
-    wc->ddsd.dwHeight = wc->rectOffScreen.bottom - wc->rectOffScreen.top;
-    wc->ddsd.dwWidth = wc->rectOffScreen.right - wc->rectOffScreen.left;
-
-    ddrval = wc->lpDD->lpVtbl->CreateSurface( wc->lpDD, &(wc->ddsd), &(wc->lpDDSOffScreen), NULL );
-    if( ddrval != DD_OK )
-    {
-        return FALSE;
-    }
-
-    while (wc->lpDDSOffScreen->lpVtbl->Lock(wc->lpDDSOffScreen,NULL, &(wc->ddsd), 0, NULL) == DDERR_WASSTILLDRAWING)
-        ;
-    //  while ((ddrval = wc->lpDDSOffScreen->lpVtbl->Lock(wc->lpDDSOffScreen,NULL, &(wc->ddsd), DDLOCK_SURFACEMEMORYPTR , NULL)) != DD_OK)
-    ;
-    if(wc->ddsd.lpSurface==NULL)
-        return initFail(wc->hwnd, wc);
-
-    wc->ScreenMem = wc->pbPixels = wc->addrOffScreen = (PBYTE)(wc->ddsd.lpSurface);
-    wc->ScanWidth = wc->pitch = wc->ddsd.lPitch;
-    if (stereo_flag)
-        wc->ScanWidth = wc->ddsd.lPitch*2;
-
-    GetClientRect( wc->hwnd, &(wc->rectSurface) );
-    pt.x = pt.y = 0;
-    ClientToScreen( wc->hwnd, &pt );
-    OffsetRect(&(wc->rectSurface), pt.x, pt.y);
-    wmSetPixelFormat(wc, wc->hDC);
-    return TRUE;
-}
-
-/*
-* doInit - do work required for every instance of the application:
-*                create the window, initialize data
-*/
-static BOOL DDInit( WMesaContext wc, HWND hwnd)
-{
-    HRESULT             ddrval;
-    DWORD dwFrequency;
-
-    LPDIRECTDRAW            lpDD;           // DirectDraw object
-    LPDIRECTDRAW2            lpDD2;
-
-
-    wc->fullScreen = displayOptions.fullScreen;
-    wc->gMode = displayOptions.mode;
-    wc->hwnd = hwnd;
-    stereo_flag = displayOptions.stereo;
-    if(wc->db_flag!= GL_TRUE)
-        stereo_flag = GL_FALSE;
-        /*
-        * create the main DirectDraw object
-    */
-    ddrval = DirectDrawCreate( NULL, &(wc->lpDD), NULL );
-    if( ddrval != DD_OK )
-    {
-        return initFail(hwnd,wc);
-    }
-
-    // Get exclusive mode if requested
-    if(wc->fullScreen)
-    {
-        ddrval = wc->lpDD->lpVtbl->SetCooperativeLevel( wc->lpDD, hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN );
-    }
-    else
-    {
-        ddrval = wc->lpDD->lpVtbl->SetCooperativeLevel( wc->lpDD, hwnd, DDSCL_NORMAL );
-    }
-    if( ddrval != DD_OK )
-    {
-        return initFail(hwnd , wc);
-    }
-
-
-    /*  ddrval = wc->lpDD->lpVtbl->QueryInterface(wc->lpDD, IID_IDirectDraw2,
-    (LPVOID *)((wc->lpDD2)));
-
-    */
-    if(ddrval != DD_OK)
-        return initFail(hwnd , wc);
-
-
-    //ddrval = wc->lpDD->lpVtbl->GetDisplayMode( wc->lpDD, &(wc->ddsd));
-    //  wc->lpDD2->lpVtbl->GetMonitorFrequency(wc->lpDD, &dwFrequency);
-    switch( wc->gMode )
-    {
-    case 1:  ddrval = wc->lpDD->lpVtbl->SetDisplayMode( wc->lpDD, 640, 480, displayOptions.bpp); break;
-    case 2:  ddrval = wc->lpDD->lpVtbl->SetDisplayMode( wc->lpDD, 800, 600, displayOptions.bpp); break;
-    case 3:  ddrval = wc->lpDD->lpVtbl->SetDisplayMode( wc->lpDD, 1024, 768, displayOptions.bpp); break;
-    case 4:  ddrval = wc->lpDD->lpVtbl->SetDisplayMode( wc->lpDD, 1152, 864, displayOptions.bpp); break;
-    case 5:  ddrval = wc->lpDD->lpVtbl->SetDisplayMode( wc->lpDD, 1280, 1024, displayOptions.bpp); break;
-    }
-
-    if( ddrval != DD_OK )
-    {
-        printf("Can't modify display mode, current mode used\n");
-        //        return initFail(hwnd , wc);
-    }
-    //ddrval = wc->lpDD->lpVtbl->GetDisplayMode( wc->lpDD, &(wc->ddsd));
-    switch(ddrval){
-    case DDERR_INVALIDOBJECT:
-        break;
-    case DDERR_INVALIDPARAMS:
-        break;
-    case DDERR_UNSUPPORTEDMODE:
-        ;
-    }
-
-    if(DDCreatePrimarySurface(wc) == GL_FALSE)
-        return initFail(hwnd, wc);
-
-    if(wc->db_flag)
-        return DDCreateOffScreen(wc);
-} /* DDInit */
-
-static void DDFree( WMesaContext wc)
-{
-    if( wc->lpDD != NULL )
-    {
-        DDFreePrimarySurface(wc);
-        DDDeleteOffScreen(wc);
-        wc->lpDD->lpVtbl->Release(wc->lpDD);
-        wc->lpDD = NULL;
-    }
-    // Clean up the screen on exit
-    RedrawWindow( NULL, NULL, NULL, RDW_INVALIDATE | RDW_ERASE |
-        RDW_ALLCHILDREN );
-
-}
-#endif
-
-void WMesaMove(void)
-{
-    WMesaContext wc = Current;
-    POINT   pt;
-    if (Current != NULL){
-        GetClientRect( wc->hwnd, &(wc->rectSurface) );
-        pt.x = pt.y = 0;
-        ClientToScreen( wc->hwnd, &pt );
-        OffsetRect(&(wc->rectSurface), pt.x, pt.y);
-    }
-}
-
-
-
-/*
-* Like PACK_8A8B8G8R() but don't use alpha.  This is usually an acceptable
-* shortcut.
-*/
-#define PACK_8B8G8R( R, G, B )   ( ((B) << 16) | ((G) << 8) | (R) )
-
-
-/**********************************************************************/
-/***                   Triangle rendering                            ***/
-/**********************************************************************/
-
-/*
- * XImage, smooth, depth-buffered, PF_8A8B8G8R triangle.
- */
-static void smooth_8A8B8G8R_z_triangle( GLcontext *ctx,
-                                       GLuint v0, GLuint v1, GLuint v2,
-                                       GLuint pv )
-{
-    WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;
-#define INTERP_Z 1
-#define INTERP_RGB 1
-#define PIXEL_ADDRESS(X,Y) PIXELADDR4(X,Y)
-#define PIXEL_TYPE GLuint
-    //#define BYTES_PER_ROW (wmesa->xm_buffer->backimage->bytes_per_line)
-#define BYTES_PER_ROW (wmesa->ScanWidth)
-#define INNER_LOOP( LEFT, RIGHT, Y )                    \
-    {                                   \
-    GLint i, len = RIGHT-LEFT;                      \
-    for (i=0;i<len;i++) {                       \
-    GLdepth z = FixedToDepth(ffz);                  \
-    if (z < zRow[i]) {                      \
-    pRow[i] = PACK_8B8G8R( FixedToInt(ffr), FixedToInt(ffg),    \
-    FixedToInt(ffb) );          \
-    zRow[i] = z;                            \
-    }                                   \
-    ffr += fdrdx;  ffg += fdgdx;  ffb += fdbdx;         \
-    ffz += fdzdx;                           \
-    }                                   \
-    }
-#ifdef WIN32
-       #include "..\tritemp.h"
-#else
-       #include "tritemp.h"
-#endif
-}
-
-
-/*
-* XImage, smooth, depth-buffered, PF_8R8G8B triangle.
-*/
-static void smooth_8R8G8B_z_triangle( GLcontext *ctx,
-                                     GLuint v0, GLuint v1, GLuint v2,
-                                     GLuint pv )
-{
-    WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;
-#define INTERP_Z 1
-#define INTERP_RGB 1
-#define PIXEL_ADDRESS(X,Y) PIXELADDR4(X,Y)
-#define PIXEL_TYPE GLuint
-    //#define BYTES_PER_ROW (wmesa->xm_buffer->backimage->bytes_per_line)
-#define BYTES_PER_ROW (wmesa->ScanWidth)
-#define INNER_LOOP( LEFT, RIGHT, Y )                    \
-    {                                   \
-    GLint i, len = RIGHT-LEFT;                      \
-    for (i=0;i<len;i++) {                       \
-    GLdepth z = FixedToDepth(ffz);                  \
-    if (z < zRow[i]) {                      \
-    pRow[i] = PACK_8R8G8B( FixedToInt(ffr), FixedToInt(ffg),    \
-    FixedToInt(ffb) );          \
-    zRow[i] = z;                            \
-    }                                   \
-    ffr += fdrdx;  ffg += fdgdx;  ffb += fdbdx;         \
-    ffz += fdzdx;                           \
-    }                                   \
-    }
-#ifdef WIN32
-       #include "..\tritemp.h"
-#else
-       #include "tritemp.h"
-#endif
-}
-
-
-
-/*
-* XImage, smooth, depth-buffered, PF_5R6G5B triangle.
-*/
-static void smooth_5R6G5B_z_triangle( GLcontext *ctx,
-                                     GLuint v0, GLuint v1, GLuint v2,
-                                     GLuint pv )
-{
-    WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;
-#define INTERP_Z 1
-#define INTERP_RGB 1
-#define PIXEL_ADDRESS(X,Y) PIXELADDR2(X,Y)
-#define PIXEL_TYPE GLushort
-    //#define BYTES_PER_ROW (wmesa->xm_buffer->backimage->bytes_per_line)
-#define BYTES_PER_ROW (wmesa->ScanWidth)
-#define INNER_LOOP( LEFT, RIGHT, Y )                    \
-    {                                   \
-    GLint i, len = RIGHT-LEFT;                      \
-    for (i=0;i<len;i++) {                       \
-    GLdepth z = FixedToDepth(ffz);                  \
-    if (z < zRow[i]) {                      \
-    pRow[i] = PACK_5R6G5B( FixedToInt(ffr), FixedToInt(ffg),    \
-    FixedToInt(ffb) );          \
-    zRow[i] = z;                            \
-    }                                   \
-    ffr += fdrdx;  ffg += fdgdx;  ffb += fdbdx;         \
-    ffz += fdzdx;                           \
-    }                                   \
-    }
-#ifdef WIN32
-       #include "..\tritemp.h"
-#else
-       #include "tritemp.h"
-#endif
-}
-
-/*
-* XImage, flat, depth-buffered, PF_8A8B8G8R triangle.
-*/
-static void flat_8A8B8G8R_z_triangle( GLcontext *ctx, GLuint v0,
-                                     GLuint v1, GLuint v2, GLuint pv )
-{
-    WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;
-#define INTERP_Z 1
-#define PIXEL_ADDRESS(X,Y) PIXELADDR4(X,Y)
-#define PIXEL_TYPE GLuint
-    //#define BYTES_PER_ROW (wmesa->xm_buffer->backimage->bytes_per_line)
-#define BYTES_PER_ROW (wmesa->ScanWidth)
-#define SETUP_CODE                  \
-    unsigned long p = PACK_8B8G8R( VB->Color[pv][0],    \
-    VB->Color[pv][1], VB->Color[pv][2] );
-#define INNER_LOOP( LEFT, RIGHT, Y )                    \
-    {                                   \
-    GLint i, len = RIGHT-LEFT;                      \
-    for (i=0;i<len;i++) {                       \
-    GLdepth z = FixedToDepth(ffz);                  \
-    if (z < zRow[i]) {                      \
-    pRow[i] = p;                            \
-    zRow[i] = z;                            \
-    }                                   \
-    ffz += fdzdx;                           \
-    }                                   \
-    }
-#ifdef WIN32
-       #include "..\tritemp.h"
-#else
-       #include "tritemp.h"
-#endif
-}
-
-
-/*
-* XImage, flat, depth-buffered, PF_8R8G8B triangle.
-*/
-static void flat_8R8G8B_z_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
-                                   GLuint v2, GLuint pv )
-{
-    WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;
-#define INTERP_Z 1
-#define PIXEL_ADDRESS(X,Y) PIXELADDR4(X,Y)
-#define PIXEL_TYPE GLuint
-    //#define BYTES_PER_ROW (wmesa->xm_buffer->backimage->bytes_per_line)
-#define BYTES_PER_ROW (wmesa->ScanWidth)
-#define SETUP_CODE                  \
-    unsigned long p = PACK_8R8G8B( VB->Color[pv][0],    \
-    VB->Color[pv][1], VB->Color[pv][2] );
-#define INNER_LOOP( LEFT, RIGHT, Y )            \
-    {                           \
-    GLint i, len = RIGHT-LEFT;              \
-    for (i=0;i<len;i++) {               \
-    GLdepth z = FixedToDepth(ffz);          \
-    if (z < zRow[i]) {              \
-    pRow[i] = p;                    \
-    zRow[i] = z;                    \
-    }                           \
-    ffz += fdzdx;                   \
-    }                           \
-    }
-#ifdef WIN32
-       #include "..\tritemp.h"
-#else
-       #include "tritemp.h"
-#endif
-}
-
-
-/*
-* XImage, flat, depth-buffered, PF_5R6G5B triangle.
-*/
-static void flat_5R6G5B_z_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
-                                   GLuint v2, GLuint pv )
-{
-    WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;
-#define INTERP_Z 1
-#define PIXEL_ADDRESS(X,Y) PIXELADDR2(X,Y)
-#define PIXEL_TYPE GLushort
-    //#define BYTES_PER_ROW (wmesa->xm_buffer->backimage->bytes_per_line)
-#define BYTES_PER_ROW (wmesa->ScanWidth)
-#define SETUP_CODE                  \
-    unsigned long p = PACK_5R6G5B( VB->Color[pv][0],    \
-    VB->Color[pv][1], VB->Color[pv][2] );
-#define INNER_LOOP( LEFT, RIGHT, Y )            \
-    {                           \
-    GLint i, len = RIGHT-LEFT;              \
-    for (i=0;i<len;i++) {               \
-    GLdepth z = FixedToDepth(ffz);          \
-    if (z < zRow[i]) {              \
-    pRow[i] = p;                    \
-    zRow[i] = z;                    \
-    }                           \
-    ffz += fdzdx;                   \
-    }                           \
-    }
-#ifdef WIN32
-       #include "..\tritemp.h"
-#else
-       #include "tritemp.h"
-#endif
-}
-
-
-/*
-* XImage, smooth, NON-depth-buffered, PF_8A8B8G8R triangle.
-*/
-static void smooth_8A8B8G8R_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
-                                     GLuint v2, GLuint pv )
-{
-    WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;
-#define INTERP_RGB 1
-#define PIXEL_ADDRESS(X,Y) PIXELADDR4(X,Y)
-#define PIXEL_TYPE GLuint
-    //#define BYTES_PER_ROW (wmesa->xm_buffer->backimage->bytes_per_line)
-#define BYTES_PER_ROW (wmesa->ScanWidth)
-#define INNER_LOOP( LEFT, RIGHT, Y )                    \
-    {                                   \
-    GLint xx;                               \
-    PIXEL_TYPE *pixel = pRow;                       \
-    for (xx=LEFT;xx<RIGHT;xx++,pixel++) {               \
-    *pixel = PACK_8B8G8R( FixedToInt(ffr), FixedToInt(ffg),     \
-                FixedToInt(ffb) );          \
-                ffr += fdrdx;  ffg += fdgdx;  ffb += fdbdx;         \
-    }                                   \
-    }
-#ifdef WIN32
-       #include "..\tritemp.h"
-#else
-       #include "tritemp.h"
-#endif
-}
-
-
-/*
-* XImage, smooth, NON-depth-buffered, PF_8R8G8B triangle.
-*/
-static void smooth_8R8G8B_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
-                                   GLuint v2, GLuint pv )
-{
-    WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;
-#define INTERP_RGB 1
-#define PIXEL_ADDRESS(X,Y) PIXELADDR4(X,Y)
-#define PIXEL_TYPE GLuint
-    //#define BYTES_PER_ROW (wmesa->xm_buffer->backimage->bytes_per_line)
-#define BYTES_PER_ROW (wmesa->ScanWidth)
-#define INNER_LOOP( LEFT, RIGHT, Y )                    \
-    {                                   \
-    GLint xx;                               \
-    PIXEL_TYPE *pixel = pRow;                       \
-    for (xx=LEFT;xx<RIGHT;xx++,pixel++) {               \
-    *pixel = PACK_8R8G8B( FixedToInt(ffr), FixedToInt(ffg),     \
-                FixedToInt(ffb) );          \
-                ffr += fdrdx;  ffg += fdgdx;  ffb += fdbdx;         \
-    }                                   \
-    }
-#ifdef WIN32
-       #include "..\tritemp.h"
-#else
-       #include "tritemp.h"
-#endif
-}
-
-
-/*
-* XImage, smooth, NON-depth-buffered, PF_5R6G5B triangle.
-*/
-static void smooth_5R6G5B_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
-                                   GLuint v2, GLuint pv )
-{
-    WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;
-#define INTERP_RGB 1
-#define PIXEL_ADDRESS(X,Y) PIXELADDR2(X,Y)
-#define PIXEL_TYPE GLushort
-    //#define BYTES_PER_ROW (wmesa->xm_buffer->backimage->bytes_per_line)
-#define BYTES_PER_ROW (wmesa->ScanWidth)
-#define INNER_LOOP( LEFT, RIGHT, Y )                    \
-    {                                   \
-    GLint xx;                               \
-    PIXEL_TYPE *pixel = pRow;                       \
-    for (xx=LEFT;xx<RIGHT;xx++,pixel++) {               \
-    *pixel = PACK_5R6G5B( FixedToInt(ffr), FixedToInt(ffg),     \
-                FixedToInt(ffb) );          \
-                ffr += fdrdx;  ffg += fdgdx;  ffb += fdbdx;         \
-    }                                   \
-    }
-#ifdef WIN32
-       #include "..\tritemp.h"
-#else
-       #include "tritemp.h"
-#endif
-}
-
-
-
-/*
-* XImage, flat, NON-depth-buffered, PF_8A8B8G8R triangle.
-*/
-static void flat_8A8B8G8R_triangle( GLcontext *ctx, GLuint v0,
-                                   GLuint v1, GLuint v2, GLuint pv )
-{
-    WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;
-#define PIXEL_ADDRESS(X,Y) PIXELADDR4(X,Y)
-#define PIXEL_TYPE GLuint
-    //#define BYTES_PER_ROW (wmesa->xm_buffer->backimage->bytes_per_line)
-#define BYTES_PER_ROW (wmesa->ScanWidth)
-#define SETUP_CODE                  \
-    unsigned long p = PACK_8B8G8R( VB->Color[pv][0],    \
-    VB->Color[pv][1], VB->Color[pv][2] );
-#define INNER_LOOP( LEFT, RIGHT, Y )            \
-    {                           \
-    GLint xx;                       \
-    PIXEL_TYPE *pixel = pRow;               \
-    for (xx=LEFT;xx<RIGHT;xx++,pixel++) {       \
-    *pixel = p;                 \
-    }                           \
-    }
-#ifdef WIN32
-       #include "..\tritemp.h"
-#else
-       #include "tritemp.h"
-#endif
-}
-
-
-/*
-* XImage, flat, NON-depth-buffered, PF_8R8G8B triangle.
-*/
-static void flat_8R8G8B_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
-                                 GLuint v2, GLuint pv )
-{
-    WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;
-#define PIXEL_ADDRESS(X,Y) PIXELADDR4(X,Y)
-#define PIXEL_TYPE GLuint
-    //#define BYTES_PER_ROW (wmesa->xm_buffer->backimage->bytes_per_line)
-#define BYTES_PER_ROW (wmesa->ScanWidth)
-#define SETUP_CODE                  \
-    unsigned long p = PACK_8R8G8B( VB->Color[pv][0],    \
-    VB->Color[pv][1], VB->Color[pv][2] );
-#define INNER_LOOP( LEFT, RIGHT, Y )            \
-    {                           \
-    GLint xx;                       \
-    PIXEL_TYPE *pixel = pRow;               \
-    for (xx=LEFT;xx<RIGHT;xx++,pixel++) {       \
-    *pixel = p;                 \
-    }                           \
-    }
-#ifdef WIN32
-       #include "..\tritemp.h"
-#else
-       #include "tritemp.h"
-#endif
-}
-
-
-/*
-* XImage, flat, NON-depth-buffered, PF_5R6G5B triangle.
-*/
-static void flat_5R6G5B_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
-                                 GLuint v2, GLuint pv )
-{
-    WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;
-#define PIXEL_ADDRESS(X,Y) PIXELADDR2(X,Y)
-#define PIXEL_TYPE GLushort
-    //#define BYTES_PER_ROW (wmesa->xm_buffer->backimage->bytes_per_line)
-#define BYTES_PER_ROW (wmesa->ScanWidth)
-#define SETUP_CODE                  \
-    unsigned long p = PACK_5R6G5B( VB->Color[pv][0],    \
-    VB->Color[pv][1], VB->Color[pv][2] );
-#define INNER_LOOP( LEFT, RIGHT, Y )            \
-    {                           \
-    GLint xx;                       \
-    PIXEL_TYPE *pixel = pRow;               \
-    for (xx=LEFT;xx<RIGHT;xx++,pixel++) {       \
-    *pixel = p;                 \
-    }                           \
-    }
-#ifdef WIN32
-       #include "..\tritemp.h"
-#else
-       #include "tritemp.h"
-#endif
-}
-
-
-/*
-* XImage, smooth, depth-buffered, 8-bit PF_LOOKUP triangle.
-*/
-
-static void smooth_ci_z_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
-                                 GLuint v2, GLuint pv )
-{
-    WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;
-#define INTERP_Z 1
-#define INTERP_INDEX 1
-#define PIXEL_ADDRESS(X,Y) PIXELADDR1(X,Y)
-#define PIXEL_TYPE GLubyte
-#define BYTES_PER_ROW (wmesa->ScanWidth)
-#define INNER_LOOP( LEFT, RIGHT, Y )                                \
-    {                                                                   \
-    GLint i, len = RIGHT-LEFT;                                      \
-    for (i=0;i<len;i++) {                                           \
-    GLdepth z = FixedToDepth(ffz);                              \
-    if (z < zRow[i]) {                                          \
-    pRow[i] = FixedToInt(ffi);                                  \
-    zRow[i] = z;                                                \
-    }                                                               \
-    ffi += fdidx;                                                   \
-    ffz += fdzdx;                                                   \
-    }                                                               \
-    }
-
-#ifdef WIN32
-       #include "..\tritemp.h"
-#else
-       #include "tritemp.h"
-#endif
-}
-
-
-/*
-* XImage, flat, depth-buffered, 8-bit PF_LOOKUP triangle.
-*/
-
-static void flat_ci_z_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
-                               GLuint v2, GLuint pv )
-{
-    WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;
-#define INTERP_Z 1
-#define PIXEL_ADDRESS(X,Y) PIXELADDR1(X,Y)
-#define PIXEL_TYPE GLubyte
-#define BYTES_PER_ROW (wmesa->ScanWidth)
-#define SETUP_CODE                                                  \
-    GLuint index = VB->Index[pv];                                   \
-    if (!VB->MonoColor) {                                           \
-    /* set the color index */                                       \
-    (*ctx->Driver.Index)( ctx, index );                         \
-    }
-#define INNER_LOOP( LEFT, RIGHT, Y )                                \
-    {                                                                   \
-    GLint i, len = RIGHT-LEFT;                                      \
-    for (i=0;i<len;i++) {                                           \
-    GLdepth z = FixedToDepth(ffz);                              \
-    if (z < zRow[i]) {                                          \
-    pRow[i] = index;                                            \
-    zRow[i] = z;                                                \
-    }                                                               \
-    ffz += fdzdx;                                                   \
-    }                                                               \
-    }
-#ifdef WIN32
-       #include "..\tritemp.h"
-#else
-       #include "tritemp.h"
-#endif
-}
-
-
-
-/*
-* XImage, smooth, NON-depth-buffered, 8-bit PF_LOOKUP triangle.
-*/
-
-static void smooth_ci_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
-                               GLuint v2, GLuint pv )
-{
-    WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;
-#define INTERP_Z 1
-#define INTERP_INDEX 1
-#define PIXEL_ADDRESS(X,Y) PIXELADDR1(X,Y)
-#define PIXEL_TYPE GLubyte
-#define BYTES_PER_ROW (wmesa->ScanWidth)
-#define INNER_LOOP( LEFT, RIGHT, Y )                    \
-    {                                   \
-    GLint xx;                               \
-    PIXEL_TYPE *pixel = pRow;                       \
-    for (xx=LEFT;xx<RIGHT;xx++,pixel++) {               \
-    *pixel = FixedToInt(ffi);           \
-    ffi += fdidx;           \
-    }                                   \
-    }
-#ifdef WIN32
-       #include "..\tritemp.h"
-#else
-       #include "tritemp.h"
-#endif
-}
-
-
-/*
-* XImage, flat, NON-depth-buffered, 8-bit PF_LOOKUP triangle.
-*/
-static void flat_ci_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
-                             GLuint v2, GLuint pv )
-{
-    WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;
-#define INTERP_Z 1
-#define PIXEL_ADDRESS(X,Y) PIXELADDR1(X,Y)
-#define PIXEL_TYPE GLubyte
-#define BYTES_PER_ROW (wmesa->ScanWidth)
-#define SETUP_CODE                                                  \
-    GLuint index = VB->Index[pv];                                   \
-    if (!VB->MonoColor) {                                           \
-    /* set the color index */                                       \
-    (*ctx->Driver.Index)( ctx, index );                         \
-    }
-#define INNER_LOOP( LEFT, RIGHT, Y )            \
-    {                           \
-    GLint xx;                       \
-    PIXEL_TYPE *pixel = pRow;               \
-    for (xx=LEFT;xx<RIGHT;xx++,pixel++) {       \
-    *pixel = index;                 \
-    }                           \
-    }
-#ifdef WIN32
-       #include "..\tritemp.h"
-#else
-       #include "tritemp.h"
-#endif
-}
-
-/*
-* XImage, smooth, depth-buffered, 8-bit, PF_DITHER8 triangle.
-*/
-static void smooth_DITHER8_z_triangle( GLcontext *ctx,
-                                      GLuint v0, GLuint v1, GLuint v2,
-                                      GLuint pv )
-{
-    WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;
-    DITHER_RGB_TO_8BIT_SETUP
-#define INTERP_Z 1
-#define INTERP_RGB 1
-#define PIXEL_ADDRESS(X,Y) PIXELADDR1(X,Y)
-#define PIXEL_TYPE GLubyte
-#define BYTES_PER_ROW (wmesa->ScanWidth)
-#define INNER_LOOP( LEFT, RIGHT, Y )                                    \
-    {                                                                       \
-    GLint i, xx = LEFT, yy = FLIP(Y), len = RIGHT-LEFT;                 \
-    for (i=0;i<len;i++,xx++) {                                          \
-    GLdepth z = FixedToDepth(ffz);                                  \
-    if (z < zRow[i]) {                                              \
-    DITHER_RGB_TO_8BIT( FixedToInt(ffr), FixedToInt(ffg),           \
-    FixedToInt(ffb), xx, yy);               \
-    pRow[i] = pixelDithered;                                        \
-    zRow[i] = z;                                                    \
-    }                                                                   \
-    ffr += fdrdx;  ffg += fdgdx;  ffb += fdbdx;                     \
-    ffz += fdzdx;                                                       \
-    }                                                                   \
-    }
-#ifdef WIN32
-       #include "..\tritemp.h"
-#else
-       #include "tritemp.h"
-#endif
-}
-
-/*
-* XImage, flat, depth-buffered, 8-bit PF_DITHER triangle.
-*/
-static void flat_DITHER8_z_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
-                                    GLuint v2, GLuint pv )
-{
-    WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;
-    DITHER_RGB_TO_8BIT_SETUP
-#define INTERP_Z 1
-#define PIXEL_ADDRESS(X,Y) PIXELADDR1(X,Y)
-#define PIXEL_TYPE GLubyte
-#define BYTES_PER_ROW (wmesa->ScanWidth)
-
-#define INNER_LOOP( LEFT, RIGHT, Y )                                    \
-    {                                                                       \
-    GLint i, xx = LEFT, yy = FLIP(Y), len = RIGHT-LEFT;                 \
-    for (i=0;i<len;i++,xx++) {                                          \
-    GLdepth z = FixedToDepth(ffz);                                  \
-    if (z < zRow[i]) {                                              \
-    DITHER_RGB_TO_8BIT( VB->Color[pv][0],                           \
-             VB->Color[pv][1], VB->Color[pv][2], xx, yy);               \
-             pRow[i] = pixelDithered;                                       \
-             zRow[i] = z;                                                   \
-    }                                                                   \
-    ffz += fdzdx;                                                       \
-    }                                                                   \
-    }
-#ifdef WIN32
-       #include "..\tritemp.h"
-#else
-       #include "tritemp.h"
-#endif
-}
-
-/*
-* XImage, smooth, NON-depth-buffered, 8-bit PF_DITHER triangle.
-*/
-static void smooth_DITHER8_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
-                                    GLuint v2, GLuint pv )
-{
-    WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;
-    DITHER_RGB_TO_8BIT_SETUP
-#define INTERP_RGB 1
-#define PIXEL_ADDRESS(X,Y) PIXELADDR1(X,Y)
-#define PIXEL_TYPE GLubyte
-#define BYTES_PER_ROW (wmesa->ScanWidth)
-#define INNER_LOOP( LEFT, RIGHT, Y )                                    \
-    {                                                                       \
-    GLint xx, yy = FLIP(Y);                                             \
-    PIXEL_TYPE *pixel = pRow;                                           \
-    for (xx=LEFT;xx<RIGHT;xx++,pixel++) {                               \
-    DITHER_RGB_TO_8BIT( VB->Color[pv][0],   VB->Color[pv][1], VB->Color[pv][2], xx, yy);\
-    *pixel = pixelDithered;                                         \
-    ffr += fdrdx;  ffg += fdgdx;  ffb += fdbdx;                     \
-    }                                                                   \
-    }
-#ifdef WIN32
-       #include "..\tritemp.h"
-#else
-       #include "tritemp.h"
-#endif
-}
-
-/*
-* XImage, flat, NON-depth-buffered, 8-bit PF_DITHER triangle.
-*/
-
-static void flat_DITHER8_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
-                                  GLuint v2, GLuint pv )
-{
-    WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;
-    DITHER_RGB_TO_8BIT_SETUP
-#define PIXEL_ADDRESS(X,Y) PIXELADDR1(X,Y)
-#define PIXEL_TYPE GLubyte
-#define BYTES_PER_ROW (wmesa->ScanWidth)
-
-#define INNER_LOOP( LEFT, RIGHT, Y )                                    \
-    {                                                                       \
-    GLint xx, yy = FLIP(Y);                                             \
-    PIXEL_TYPE *pixel = pRow;                                           \
-    for (xx=LEFT;xx<RIGHT;xx++,pixel++) {                               \
-    DITHER_RGB_TO_8BIT( VB->Color[pv][0],                               \
-             VB->Color[pv][1], VB->Color[pv][2], xx, yy);               \
-             *pixel = pixelDithered;                                            \
-    }                                                                   \
-    }
-#ifdef WIN32
-       #include "..\tritemp.h"
-#else
-       #include "tritemp.h"
-#endif
-}
-
-
-
-
-static triangle_func choose_triangle_function( GLcontext *ctx )
-{
-    WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;
-    int depth = wmesa->cColorBits;
-
-    if (ctx->Polygon.SmoothFlag)     return NULL;
-    if (ctx->Texture.Enabled)        return NULL;
-    if (!wmesa->db_flag) return NULL;
-    /*if (wmesa->xm_buffer->buffer==XIMAGE)*/ {
-    if (   ctx->Light.ShadeModel==GL_SMOOTH
-        && ctx->_RasterMask==DEPTH_BIT
-        && ctx->Depth.Func==GL_LESS
-        && ctx->Depth.Mask==GL_TRUE
-        && ctx->Polygon.StippleFlag==GL_FALSE) {
-        switch (wmesa->pixelformat) {
-        case PF_8A8B8G8R:
-            return smooth_8A8B8G8R_z_triangle;
-        case PF_8R8G8B:
-            return smooth_8R8G8B_z_triangle;
-        case PF_5R6G5B:
-            return smooth_5R6G5B_z_triangle;
-        case PF_DITHER8:
-            return  smooth_DITHER8_z_triangle;
-        case PF_INDEX8:
-            return smooth_ci_z_triangle;
-        default:
-            return NULL;
-        }
-    }
-    if (   ctx->Light.ShadeModel==GL_FLAT
-        && ctx->_RasterMask==DEPTH_BIT
-        && ctx->Depth.Func==GL_LESS
-        && ctx->Depth.Mask==GL_TRUE
-        && ctx->Polygon.StippleFlag==GL_FALSE) {
-        switch (wmesa->pixelformat) {
-        case PF_8A8B8G8R:
-            return flat_8A8B8G8R_z_triangle;
-        case PF_8R8G8B:
-            return flat_8R8G8B_z_triangle;
-        case PF_5R6G5B:
-            return flat_5R6G5B_z_triangle;
-        case PF_DITHER8:
-            return flat_DITHER8_z_triangle;
-        case PF_INDEX8:
-            return flat_ci_z_triangle;
-        default:
-            return NULL;
-        }
-    }
-    if (   ctx->_RasterMask==0   /* no depth test */
-        && ctx->Light.ShadeModel==GL_SMOOTH
-        && ctx->Polygon.StippleFlag==GL_FALSE) {
-        switch (wmesa->pixelformat) {
-        case PF_8A8B8G8R:
-            return smooth_8A8B8G8R_triangle;
-        case PF_8R8G8B:
-            return smooth_8R8G8B_triangle;
-        case PF_5R6G5B:
-            return smooth_5R6G5B_triangle;
-        case PF_DITHER8:
-            return smooth_DITHER8_triangle;
-        case PF_INDEX8:
-            return smooth_ci_triangle;
-        default:
-            return NULL;
-        }
-    }
-
-    if (   ctx->_RasterMask==0   /* no depth test */
-        && ctx->Light.ShadeModel==GL_FLAT
-        && ctx->Polygon.StippleFlag==GL_FALSE) {
-        switch (wmesa->pixelformat) {
-        case PF_8A8B8G8R:
-            return flat_8A8B8G8R_triangle;
-        case PF_8R8G8B:
-            return flat_8R8G8B_triangle;
-        case PF_5R6G5B:
-            return flat_5R6G5B_triangle;
-        case PF_DITHER8:
-            return flat_DITHER8_triangle;
-        case PF_INDEX8:
-            return flat_ci_triangle;
-        default:
-            return NULL;
-        }
-    }
-
-    return NULL;
-    }
-}
-
-/*
-* Define a new viewport and reallocate auxillary buffers if the size of
-* the window (color buffer) has changed.
-*/
-void WMesaViewport( GLcontext *ctx,
-                   GLint x, GLint y, GLsizei width, GLsizei height )
-{
-    /* Save viewport */
-    ctx->Viewport.X = x;
-    ctx->Viewport.Width = width;
-    ctx->Viewport.Y = y;
-    ctx->Viewport.Height = height;
-
-    /* compute scale and bias values */
-    ctx->Viewport.Sx = (GLfloat) width / 2.0F;
-    ctx->Viewport.Tx = ctx->Viewport.Sx + x;
-    ctx->Viewport.Sy = (GLfloat) height / 2.0F;
-    ctx->Viewport.Ty = ctx->Viewport.Sy + y;
-}
diff --git a/src/mesa/drivers/windows/wmesaOld.c b/src/mesa/drivers/windows/wmesaOld.c
deleted file mode 100644 (file)
index a546676..0000000
+++ /dev/null
@@ -1,2749 +0,0 @@
-/*\r
- *     File name       :       wmesa.c\r
- *  Version            :       2.3\r
- *\r
- *  Display driver for Mesa 2.3  under\r
- *     Windows95 and WindowsNT\r
- *\r
- *     Copyright (C) 1996-  Li Wei\r
- *  Address            :               Institute of Artificial Intelligence\r
- *                             :                       & Robotics\r
- *                             :               Xi'an Jiaotong University\r
- *  Email              :               liwei@aiar.xjtu.edu.cn\r
- *  Web page   :               http://sun.aiar.xjtu.edu.cn\r
- *\r
- *  This file and its associations are partially borrowed from the\r
- *  Windows NT driver for Mesa 1.8 , written by Mark Leaming\r
- *  (mark@rsinc.com).\r
- */\r
-\r
-\r
-/*\r
- * $Log: wmesaOld.c,v $
- * Revision 1.3  2001/03/03 20:33:29  brianp
- * lots of gl_*() to _mesa_*() namespace clean-up
- *
- * Revision 1.2  2000/11/05 18:41:00  keithw
- * - Changes for new software rasterizer modules
- * - Remove support for choosing software fallbacks from core code
- * - Remove partial fallback code from vbrender.c -- drivers are now
- *   expected to be able to find a triangle/quad function for every state,
- *   even if they have to use _swsetup_Triangle or _swsetup_Quad.
- * - Marked derived variables in the GLcontext struct with a leading
- *   underscore '_'.
- *
- * Revision 1.1.1.1  1999/08/19 00:55:42  jtg
- * Imported sources
- *
- * Revision 1.2  1999/01/03 03:08:57  brianp
- * Ted Jump's changes
- *\r
- * Revision 1.0  1997/06/14 17:51:00 CST by Li Wei(liwei@aiar.xjtu.edu.cn)\r
- * New display driver for Mesa 2.x using Microsoft Direct Draw\r
- * Initial vision\r
- */\r
-\r
-\r
-#define WMESA_STEREO_C\r
-\r
-#include <windows.h>\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include <GL/wmesa.h>\r
-#include "wmesadef.h"\r
-#include "context.h"\r
-#include "dd.h"\r
-#include "xform.h"\r
-#include "vb.h"\r
-#include "matrix.h"\r
-#include "depth.h"\r
-\r
-#ifdef PROFILE\r
-//     #include "profile.h"\r
-#endif\r
-\r
-#ifdef DITHER\r
-       #include <wing.h>\r
-#endif\r
-\r
-#ifdef __CYGWIN32__\r
-#include "macros.h"\r
-#include <string.h>\r
-#define CopyMemory memcpy\r
-#endif\r
-#include "mesa_extend.h"\r
-#include "colors.h"\r
-\r
-#if !defined(NO_STEREO)\r
-\r
-       #include "gl\glu.h"\r
-       #include "stereo.h"\r
-\r
-#endif\r
-#if !defined(NO_PARALLEL)\r
-//     #include "parallel.h"\r
-#endif\r
-\r
-struct DISPLAY_OPTIONS displayOptions;\r
-\r
-GLenum stereoCompile = GL_FALSE ;\r
-GLenum stereoShowing  = GL_FALSE ;\r
-GLenum stereoBuffer = GL_FALSE;\r
-#if !defined(NO_STEREO)\r
-GLint displayList = MAXIMUM_DISPLAY_LIST ;\r
-#endif\r
-GLint stereo_flag = 0 ;\r
-\r
-/* end of added code*/\r
-\r
-static PWMC Current = NULL;\r
-WMesaContext WC = NULL;\r
-\r
-#ifdef NDEBUG\r
-  #define assert(ignore)       ((void) 0)\r
-#else\r
-  void Mesa_Assert(void *Cond,void *File,unsigned Line)\r
-  {\r
-    char Msg[512];\r
-    sprintf(Msg,"%s %s %d",Cond,File,Line);\r
-    MessageBox(NULL,Msg,"Assertion failed.",MB_OK);\r
-    exit(1);\r
-  }\r
-  #define assert(e)    if (!e) Mesa_Assert(#e,__FILE__,__LINE__);\r
-#endif\r
-\r
-//#define DD_GETDC (Current->hDC )\r
-#define DD_GETDC ((Current->db_flag) ? Current->dib.hDC : Current->hDC )\r
-//#define DD_GETDC ((Current->db_flag) ? Current->hDCPrimary : Current->hDCBack )\r
-#define DD_RELEASEDC\r
-\r
-//#define BEGINGDICALL if(Current->rgb_flag)wmFlushBits(Current);\r
-#define BEGINGDICALL\r
-//#define ENDGDICALL           if(Current->rgb_flag)wmGetBits(Current);\r
-#define ENDGDICALL\r
-\r
-//#define FLIP(Y)  (Current->dither_flag? Y : Current->height-(Y)-1)\r
-//#define FLIP(Y)  (Current->height-(Y)-1)\r
-//#define FLIP(Y) Y\r
-#define FLIP(Y)  (Current->db_flag? Y: Current->height-(Y)-1)\r
-#define STARTPROFILE\r
-#define ENDPROFILE(PARA)\r
-\r
-#define DITHER_RGB_TO_8BIT_SETUP                       \\r
-               GLubyte pixelDithered;\r
-\r
-#define DITHER_RGB_TO_8BIT(red, green, blue, pixel, scanline)                          \\r
-{                                                                                                                                                      \\r
-       char unsigned redtemp, greentemp, bluetemp, paletteindex;                               \\r
-    redtemp = aDividedBy51[red]                                                                                                \\r
-          + (aModulo51[red] > aHalftone8x8[(pixel%8)*8                                         \\r
-          + scanline%8]);                                                                                                      \\r
-    greentemp = aDividedBy51[(char unsigned)green]                                                     \\r
-          + (aModulo51[green] > aHalftone8x8[                                                          \\r
-          (pixel%8)*8 + scanline%8]);                                                                          \\r
-    bluetemp = aDividedBy51[(char unsigned)blue]                                                       \\r
-          + (aModulo51[blue] > aHalftone8x8[                                                           \\r
-          (pixel%8)*8 +scanline%8]);                                                                           \\r
-    paletteindex = redtemp + aTimes6[greentemp] + aTimes36[bluetemp];          \\r
-       pixelDithered = aWinGHalftoneTranslation[paletteindex];                                 \\r
-}\r
-\r
-\r
-#ifdef DDRAW\r
-       static BOOL DDInit( WMesaContext wc, HWND hwnd);\r
-       static void DDFree( WMesaContext wc);\r
-       static HRESULT DDRestoreAll( WMesaContext wc );\r
-       static void DDDeleteOffScreen(WMesaContext wc);\r
-       static BOOL DDCreateOffScreen(WMesaContext wc);\r
-#endif\r
-\r
-static void FlushToFile(PWMC pwc, PSTR szFile);\r
-\r
-BOOL wmCreateBackingStore(PWMC pwc, long lxSize, long lySize);\r
-BOOL wmDeleteBackingStore(PWMC pwc);\r
-void wmCreatePalette( PWMC pwdc );\r
-BOOL wmSetDibColors(PWMC pwc);\r
-void wmSetPixel(PWMC pwc, int iScanLine, int iPixel, BYTE r, BYTE g, BYTE b);\r
-\r
-void wmCreateDIBSection(\r
-       HDC      hDC,\r
-    PWMC pwc,  // handle of device context\r
-    CONST BITMAPINFO *pbmi,    // address of structure containing bitmap size, format, and color data\r
-    UINT iUsage        // color data type indicator: RGB values or palette indices\r
-    );\r
-\r
-\r
-void WMesaViewport( GLcontext *ctx,\r
-                  GLint x, GLint y, GLsizei width, GLsizei height );\r
-\r
-static triangle_func choose_triangle_function( GLcontext *ctx );\r
-\r
-static void wmSetPixelFormat( PWMC wc, HDC hDC)\r
-{\r
-       if(wc->rgb_flag)\r
-               wc->cColorBits = GetDeviceCaps(hDC, BITSPIXEL);\r
-       else\r
-           wc->cColorBits = 8;\r
-       switch(wc->cColorBits){\r
-               case 8:\r
-                       if(wc->dither_flag != GL_TRUE)\r
-                               wc->pixelformat = PF_INDEX8;\r
-                       else\r
-                               wc->pixelformat = PF_DITHER8;\r
-                       break;\r
-               case 16:\r
-                       wc->pixelformat = PF_5R6G5B;\r
-                       break;\r
-               case 32:\r
-                       wc->pixelformat = PF_8R8G8B;\r
-                       break;\r
-               default:\r
-                       wc->pixelformat = PF_BADFORMAT;\r
-       }\r
-}\r
-\r
-//\r
-// This function sets the color table of a DIB section\r
-// to match that of the destination DC\r
-//\r
-BOOL /*WINAPI*/ wmSetDibColors(PWMC pwc)\r
-{\r
-    RGBQUAD                    *pColTab, *pRGB;\r
-    PALETTEENTRY       *pPal, *pPE;\r
-    int                                i, nColors;\r
-       BOOL                    bRet=TRUE;\r
-       DWORD                   dwErr=0;\r
-\r
-    /* Build a color table in the DIB that maps to the\r
-       selected palette in the DC.\r
-       */\r
-    nColors = 1 << pwc->cColorBits;\r
-       pPal = (PALETTEENTRY *)malloc( nColors * sizeof(PALETTEENTRY));\r
-    memset( pPal, 0, nColors * sizeof(PALETTEENTRY) );\r
-    GetPaletteEntries( pwc->hGLPalette, 0, nColors, pPal );\r
-    pColTab = (RGBQUAD *)malloc( nColors * sizeof(RGBQUAD));\r
-    for (i = 0, pRGB = pColTab, pPE = pPal; i < nColors; i++, pRGB++, pPE++) {\r
-        pRGB->rgbRed = pPE->peRed;\r
-        pRGB->rgbGreen = pPE->peGreen;\r
-        pRGB->rgbBlue = pPE->peBlue;\r
-    }\r
-       if(pwc->db_flag)\r
-           bRet = SetDIBColorTable(pwc->dib.hDC, 0, nColors, pColTab );\r
-\r
-       if(!bRet)\r
-               dwErr = GetLastError();\r
-\r
-    free( pColTab );\r
-    free( pPal );\r
-\r
-       return(bRet);\r
-}\r
-\r
-\r
-//\r
-// Free up the dib section that was created\r
-//\r
-BOOL wmDeleteBackingStore(PWMC pwc)\r
-{\r
-       SelectObject(pwc->dib.hDC, pwc->hOldBitmap);\r
-       DeleteDC(pwc->dib.hDC);\r
-       DeleteObject(pwc->hbmDIB);\r
-       UnmapViewOfFile(pwc->dib.base);\r
-       CloseHandle(pwc->dib.hFileMap);\r
-       return TRUE;\r
-}\r
-\r
-\r
-//\r
-// This function creates the DIB section that is used for combined\r
-// GL and GDI calls\r
-//\r
-BOOL /*WINAPI*/ wmCreateBackingStore(PWMC pwc, long lxSize, long lySize)\r
-{\r
-    HDC hdc = pwc->hDC;\r
-    LPBITMAPINFO pbmi = &(pwc->bmi);\r
-       int             iUsage;\r
-\r
-    pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);\r
-    pbmi->bmiHeader.biWidth = lxSize;\r
-    pbmi->bmiHeader.biHeight= -lySize;\r
-    pbmi->bmiHeader.biPlanes = 1;\r
-       if(pwc->rgb_flag)\r
-               pbmi->bmiHeader.biBitCount = GetDeviceCaps(pwc->hDC, BITSPIXEL);\r
-       else\r
-               pbmi->bmiHeader.biBitCount = 8;\r
-    pbmi->bmiHeader.biCompression = BI_RGB;\r
-    pbmi->bmiHeader.biSizeImage = 0;\r
-    pbmi->bmiHeader.biXPelsPerMeter = 0;\r
-    pbmi->bmiHeader.biYPelsPerMeter = 0;\r
-    pbmi->bmiHeader.biClrUsed = 0;\r
-    pbmi->bmiHeader.biClrImportant = 0;\r
-\r
-       iUsage = (pbmi->bmiHeader.biBitCount <= 8) ? DIB_PAL_COLORS : DIB_RGB_COLORS;\r
-\r
-       pwc->cColorBits = pbmi->bmiHeader.biBitCount;\r
-       pwc->ScanWidth = pwc->pitch = lxSize;\r
-\r
-       wmCreateDIBSection(hdc, pwc, pbmi, iUsage);\r
-\r
-       if ((iUsage == DIB_PAL_COLORS) && !(pwc->hGLPalette)) {\r
-               wmCreatePalette( pwc );\r
-               wmSetDibColors( pwc );\r
-       }\r
-       wmSetPixelFormat(pwc, pwc->hDC);\r
-       return(TRUE);\r
-\r
-}\r
-\r
-\r
-//\r
-// This function copies one scan line in a DIB section to another\r
-//\r
-BOOL GLWINAPI wmSetDIBits(PWMC pwc, UINT uiScanWidth, UINT uiNumScans, UINT nBypp, UINT uiNewWidth, LPBYTE pBits)\r
-{\r
-       UINT uiScans = 0;\r
-       LPBYTE  pDest = pwc->pbPixels;\r
-       DWORD   dwNextScan = uiScanWidth;\r
-       DWORD   dwNewScan = uiNewWidth;\r
-       DWORD   dwScanWidth = (uiScanWidth * nBypp);\r
-\r
-       //\r
-       // We need to round up to the nearest DWORD\r
-       // and multiply by the number of bytes per\r
-       // pixel\r
-       //\r
-       dwNextScan = (((dwNextScan * nBypp)+ 3) & ~3);\r
-       dwNewScan = (((dwNewScan * nBypp)+ 3) & ~3);\r
-\r
-       for(uiScans = 0; uiScans < uiNumScans; uiScans++){\r
-               CopyMemory(pDest, pBits, dwScanWidth);\r
-               pBits += dwNextScan;\r
-               pDest += dwNewScan;\r
-       }\r
-\r
-       return(TRUE);\r
-\r
-}\r
-\r
-\r
-BOOL wmFlush(PWMC pwc);\r
-\r
-/*\r
- * Useful macros:\r
-   Modified from file osmesa.c\r
- */\r
-\r
-\r
-#define PIXELADDR(X,Y)  ((GLubyte *)Current->pbPixels + (Current->height-Y-1)* Current->ScanWidth + (X)*nBypp)\r
-#define PIXELADDR1( X, Y )  \\r
-       ((GLubyte *)wmesa->pbPixels + (wmesa->height-Y-1)* wmesa->ScanWidth + (X))\r
-#define PIXELADDR2( X, Y )  \\r
-       ((GLubyte *)wmesa->pbPixels + (wmesa->height-Y-1)* wmesa->ScanWidth + (X)*2)\r
-#define PIXELADDR4( X, Y )  \\r
-       ((GLubyte *)wmesa->pbPixels + (wmesa->height-Y-1)* wmesa->ScanWidth + (X)*4)\r
-\r
-\r
-BYTE DITHER_RGB_2_8BIT( int r, int g, int b, int x, int y);\r
-\r
-/* Finish all pending operations and synchronize. */\r
-static void finish(GLcontext* ctx)\r
-{\r
- /* No op */\r
-}\r
-\r
-\r
-//\r
-// We cache all gl draw routines until a flush is made\r
-//\r
-static void flush(GLcontext* ctx)\r
-{\r
-       STARTPROFILE\r
-       if((Current->rgb_flag /*&& !(Current->dib.fFlushed)*/&&!(Current->db_flag))\r
-               ||(!Current->rgb_flag))\r
-       {\r
-               wmFlush(Current);\r
-       }\r
-       ENDPROFILE(flush)\r
-\r
-}\r
-\r
-\r
-\r
-/*\r
- * Set the color index used to clear the color buffer.\r
- */\r
-static void clear_index(GLcontext* ctx, GLuint index)\r
-{\r
-  STARTPROFILE\r
-  Current->clearpixel = index;\r
-  ENDPROFILE(clear_index)\r
-}\r
-\r
-\r
-\r
-/*\r
- * Set the color used to clear the color buffer.\r
- */\r
-static void clear_color( GLcontext* ctx, GLubyte r, GLubyte g, GLubyte b, GLubyte a )\r
-{\r
-  STARTPROFILE\r
-  Current->clearpixel=RGB(r, g, b );\r
-  ENDPROFILE(clear_color)\r
-}\r
-\r
-\r
-\r
-/*\r
- * Clear the specified region of the color buffer using the clear color\r
- * or index as specified by one of the two functions above.\r
- */\r
-static void clear(GLcontext* ctx,\r
-                                 GLboolean all,GLint x, GLint y, GLint width, GLint height )\r
-{\r
-       DWORD   dwColor;\r
-       WORD    wColor;\r
-       BYTE    bColor;\r
-       LPDWORD lpdw = (LPDWORD)Current->pbPixels;\r
-       LPWORD  lpw = (LPWORD)Current->pbPixels;\r
-       LPBYTE  lpb = Current->pbPixels;\r
-       int             lines;\r
-\r
-    STARTPROFILE\r
-\r
-       if (all){\r
-               x=y=0;\r
-               width=Current->width;\r
-               height=Current->height;\r
-       }\r
-       if(Current->db_flag==GL_TRUE){\r
-               UINT    nBypp = Current->cColorBits / 8;\r
-               int             i = 0;\r
-               int             iSize;\r
-\r
-               if(nBypp ==1 ){\r
-                       /* Need rectification */\r
-                       iSize = Current->width/4;\r
-                       bColor  = BGR8(GetRValue(Current->clearpixel),\r
-                                                  GetGValue(Current->clearpixel),\r
-                                                  GetBValue(Current->clearpixel));\r
-                       wColor  = MAKEWORD(bColor,bColor);\r
-                       dwColor = MAKELONG(wColor, wColor);\r
-               }\r
-               if(nBypp == 2){\r
-                       iSize = Current->width / 2;\r
-                       wColor = BGR16(GetRValue(Current->clearpixel),\r
-                                                  GetGValue(Current->clearpixel),\r
-                                                  GetBValue(Current->clearpixel));\r
-                       dwColor = MAKELONG(wColor, wColor);\r
-               }\r
-               else if(nBypp == 4){\r
-                       iSize = Current->width;\r
-                       dwColor = BGR32(GetRValue(Current->clearpixel),\r
-                                                  GetGValue(Current->clearpixel),\r
-                                                  GetBValue(Current->clearpixel));\r
-               }\r
-\r
-               while(i < iSize){\r
-                       *lpdw = dwColor;\r
-                       lpdw++;\r
-                       i++;\r
-               }\r
-\r
-               //\r
-               // This is the 24bit case\r
-               //\r
-               if (nBypp == 3) {\r
-                       iSize = Current->width *3/4;\r
-                       dwColor = BGR24(GetRValue(Current->clearpixel),\r
-                                                  GetGValue(Current->clearpixel),\r
-                                                  GetBValue(Current->clearpixel));\r
-                       while(i < iSize){\r
-                               *lpdw = dwColor;\r
-                               lpb += nBypp;\r
-                               lpdw = (LPDWORD)lpb;\r
-                               i++;\r
-                       }\r
-               }\r
-\r
-               i = 0;\r
-               if(stereo_flag) lines = height /2;\r
-               else lines = height;\r
-               do{\r
-                       lpb += Current->ScanWidth;\r
-                       memcpy(lpb, Current->pbPixels, iSize*4);\r
-                       i++;\r
-               }\r
-               while(i<lines-1);\r
-       }\r
-       else{ // For single buffer\r
-                HDC DC=DD_GETDC;\r
-                HPEN Pen=CreatePen(PS_SOLID,1,Current->clearpixel);\r
-                HBRUSH Brush=CreateSolidBrush(Current->clearpixel);\r
-                HPEN Old_Pen=SelectObject(DC,Pen);\r
-                HBRUSH Old_Brush=SelectObject(DC,Brush);\r
-                Rectangle(DC,x,y,x+width,y+height);\r
-                SelectObject(DC,Old_Pen);\r
-                SelectObject(DC,Old_Brush);\r
-                DeleteObject(Pen);\r
-                DeleteObject(Brush);\r
-                DD_RELEASEDC;\r
-       }\r
-\r
-\r
-\r
-       ENDPROFILE(clear)\r
-}\r
-\r
-\r
-\r
-/* Set the current color index. */\r
-static void set_index(GLcontext* ctx, GLuint index)\r
-{\r
-  STARTPROFILE\r
-  Current->pixel=index;\r
-  ENDPROFILE(set_index)\r
-}\r
-\r
-\r
-\r
-/* Set the current RGBA color. */\r
-static void set_color( GLcontext* ctx, GLubyte r, GLubyte g, GLubyte b, GLubyte a )\r
-{\r
-  STARTPROFILE\r
-  Current->pixel = RGB( r, g, b );\r
-  ENDPROFILE(set_color)\r
-}\r
-\r
-\r
-\r
-/* Set the index mode bitplane mask. */\r
-static GLboolean index_mask(GLcontext* ctx, GLuint mask)\r
-{\r
-   /* can't implement */\r
-   return GL_FALSE;\r
-}\r
-\r
-\r
-\r
-/* Set the RGBA drawing mask. */\r
-static GLboolean color_mask( GLcontext* ctx,\r
-                                                        GLboolean rmask, GLboolean gmask,\r
-                                                        GLboolean bmask, GLboolean amask)\r
-{\r
-   /* can't implement */\r
-   return GL_FALSE;\r
-}\r
-\r
-\r
-\r
-/*\r
- * Set the pixel logic operation.  Return GL_TRUE if the device driver\r
- * can perform the operation, otherwise return GL_FALSE.  If GL_FALSE\r
- * is returned, the logic op will be done in software by Mesa.\r
- */\r
-GLboolean logicop( GLcontext* ctx, GLenum op )\r
-{\r
-   /* can't implement */\r
-   return GL_FALSE;\r
-}\r
-\r
-\r
-static void dither( GLcontext* ctx, GLboolean enable )\r
-{\r
-       if(enable == GL_FALSE){\r
-          Current->dither_flag = GL_FALSE;\r
-          if(Current->cColorBits == 8)\r
-                  Current->pixelformat = PF_INDEX8;\r
-   }\r
-   else{\r
-          if (Current->rgb_flag && Current->cColorBits == 8){\r
-                  Current->pixelformat = PF_DITHER8;\r
-                  Current->dither_flag = GL_TRUE;\r
-          }\r
-          else\r
-                  Current->dither_flag = GL_FALSE;\r
-   }\r
-}\r
-\r
-\r
-\r
-static GLboolean set_buffer( GLcontext* ctx, GLenum mode )\r
-{\r
-   STARTPROFILE\r
-   /* TODO: this could be better */\r
-   if (mode==GL_FRONT || mode==GL_BACK) {\r
-      return GL_TRUE;\r
-   }\r
-   else {\r
-      return GL_FALSE;\r
-   }\r
-   ENDPROFILE(set_buffer)\r
-}\r
-\r
-\r
-\r
-/* Return characteristics of the output buffer. */\r
-static void buffer_size( GLcontext* ctx, GLuint *width, GLuint *height /*, GLuint *depth */)\r
-{\r
-\r
-       int New_Size;\r
-       RECT CR;\r
-\r
-       STARTPROFILE\r
-       GetClientRect(Current->Window,&CR);\r
-\r
-       *width=CR.right;\r
-       *height=CR.bottom;\r
-//     *depth = Current->depth;\r
-\r
-       New_Size=((*width)!=Current->width) || ((*height)!=Current->height);\r
-\r
-       if (New_Size){\r
-               Current->width=*width;\r
-               Current->height=*height;\r
-               Current->ScanWidth=Current->width;\r
-           if ((Current->ScanWidth%sizeof(long))!=0)\r
-                       Current->ScanWidth+=(sizeof(long)-(Current->ScanWidth%sizeof(long)));\r
-\r
-               if (Current->db_flag){\r
-#ifdef DDRAW\r
-                       DDDeleteOffScreen(Current);\r
-                       DDCreateOffScreen(Current);\r
-#else\r
-               if (Current->rgb_flag==GL_TRUE && Current->dither_flag!=GL_TRUE){\r
-                               wmDeleteBackingStore(Current);\r
-                               wmCreateBackingStore(Current, Current->width, Current->height);\r
-                       }\r
-#endif\r
-                       }\r
-\r
-//     Resize OsmesaBuffer if in Parallel mode\r
-#if !defined(NO_PARALLEL)\r
-                       if(parallelFlag)\r
-                       PRSizeRenderBuffer(Current->width, Current->height,Current->ScanWidth,\r
-                       Current->rgb_flag == GL_TRUE ? Current->pbPixels: Current->ScreenMem);\r
-#endif\r
-               }\r
-   ENDPROFILE(buffer_size)\r
-}\r
-\r
-\r
-\r
-/**********************************************************************/\r
-/*****           Accelerated point, line, polygon rendering       *****/\r
-/**********************************************************************/\r
-\r
-\r
-static void fast_rgb_points( GLcontext* ctx, GLuint first, GLuint last )\r
-{\r
-   GLuint i;\r
- //  HDC DC=DD_GETDC;\r
-       PWMC    pwc = Current;\r
-\r
-       STARTPROFILE\r
-\r
-       if (Current->gl_ctx->VB->MonoColor) {\r
-      /* all drawn with current color */\r
-      for (i=first;i<=last;i++) {\r
-         if (!Current->gl_ctx->VB->ClipMask[i]) {\r
-            int x, y;\r
-            x =       (GLint) Current->gl_ctx->VB->Win[i][0];\r
-            y = FLIP( (GLint) Current->gl_ctx->VB->Win[i][1] );\r
-                       wmSetPixel(pwc, y,x,GetRValue(Current->pixel),\r
-                                           GetGValue(Current->pixel), GetBValue(Current->pixel));\r
-         }\r
-      }\r
-   }\r
-   else {\r
-      /* draw points of different colors */\r
-      for (i=first;i<=last;i++) {\r
-         if (!Current->gl_ctx->VB->ClipMask[i]) {\r
-            int x, y;\r
-            unsigned long pixel=RGB(Current->gl_ctx->VB->Color[i][0]*255.0,\r
-                                    Current->gl_ctx->VB->Color[i][1]*255.0,\r
-                                    Current->gl_ctx->VB->Color[i][2]*255.0);\r
-            x =       (GLint) Current->gl_ctx->VB->Win[i][0];\r
-            y = FLIP( (GLint) Current->gl_ctx->VB->Win[i][1] );\r
-                       wmSetPixel(pwc, y,x,Current->gl_ctx->VB->Color[i][0]*255.0,\r
-                                    Current->gl_ctx->VB->Color[i][1]*255.0,\r
-                                    Current->gl_ctx->VB->Color[i][2]*255.0);\r
-         }\r
-      }\r
-   }\r
-//   DD_RELEASEDC;\r
-   ENDPROFILE(fast_rgb_points)\r
-}\r
-\r
-\r
-\r
-/* Return pointer to accerated points function */\r
-extern points_func choose_points_function( GLcontext* ctx )\r
-{\r
-   STARTPROFILE\r
-   if (ctx->Point.Size==1.0 && !ctx->Point.SmoothFlag && ctx->_RasterMask==0\r
-       && !ctx->Texture.Enabled  && ctx->Visual->RGBAflag) {\r
-   ENDPROFILE(choose_points_function)\r
-      return fast_rgb_points;\r
-   }\r
-   else {\r
-   ENDPROFILE(choose_points_function)\r
-      return NULL;\r
-   }\r
-}\r
-\r
-\r
-\r
-/* Draw a line using the color specified by Current->gl_ctx->VB->Color[pv] */\r
-static void fast_flat_rgb_line( GLcontext* ctx, GLuint v0, GLuint v1, GLuint pv )\r
-{\r
-       STARTPROFILE\r
-       int x0, y0, x1, y1;\r
-       unsigned long pixel;\r
-       HDC DC=DD_GETDC;\r
-       HPEN Pen;\r
-       HPEN Old_Pen;\r
-\r
-       if (Current->gl_ctx->VB->MonoColor) {\r
-         pixel = Current->pixel;  /* use current color */\r
-       }\r
-       else {\r
-         pixel = RGB(Current->gl_ctx->VB->Color[pv][0]*255.0, Current->gl_ctx->VB->Color[pv][1]*255.0, Current->gl_ctx->VB->Color[pv][2]*255.0);\r
-       }\r
-\r
-       x0 =       (int) Current->gl_ctx->VB->Win[v0][0];\r
-       y0 = FLIP( (int) Current->gl_ctx->VB->Win[v0][1] );\r
-       x1 =       (int) Current->gl_ctx->VB->Win[v1][0];\r
-       y1 = FLIP( (int) Current->gl_ctx->VB->Win[v1][1] );\r
-\r
-\r
-       BEGINGDICALL\r
-\r
-       Pen=CreatePen(PS_SOLID,1,pixel);\r
-       Old_Pen=SelectObject(DC,Pen);\r
-       MoveToEx(DC,x0,y0,NULL);\r
-       LineTo(DC,x1,y1);\r
-       SelectObject(DC,Old_Pen);\r
-       DeleteObject(Pen);\r
-       DD_RELEASEDC;\r
-\r
-       ENDGDICALL\r
-\r
-       ENDPROFILE(fast_flat_rgb_line)\r
-}\r
-\r
-\r
-\r
-/* Return pointer to accerated line function */\r
-static line_func choose_line_function( GLcontext* ctx )\r
-{\r
-       STARTPROFILE\r
-   if (ctx->Line.Width==1.0 && !ctx->Line.SmoothFlag && !ctx->Line.StippleFlag\r
-       && ctx->Light.ShadeModel==GL_FLAT && ctx->_RasterMask==0\r
-       && !ctx->Texture.Enabled && Current->rgb_flag) {\r
-   ENDPROFILE(choose_line_function)\r
-      return fast_flat_rgb_line;\r
-   }\r
-   else {\r
-   ENDPROFILE(choose_line_function)\r
-      return NULL;\r
-   }\r
-}\r
-\r
-\r
-/**********************************************************************/\r
-/*****                 Span-based pixel drawing                   *****/\r
-/**********************************************************************/\r
-\r
-\r
-/* Write a horizontal span of color-index pixels with a boolean mask. */\r
-static void write_index_span( GLcontext* ctx,\r
-                                                         GLuint n, GLint x, GLint y,\r
-                                                         const GLuint index[],\r
-                              const GLubyte mask[] )\r
-{\r
-         STARTPROFILE\r
-         GLuint i;\r
-         PBYTE Mem=Current->ScreenMem+FLIP(y)*Current->ScanWidth+x;\r
-         assert(Current->rgb_flag==GL_FALSE);\r
-         for (i=0; i<n; i++)\r
-               if (mask[i])\r
-                 Mem[i]=index[i];\r
-          ENDPROFILE(write_index_span)\r
-}\r
-\r
-\r
-\r
-/*\r
- * Write a horizontal span of pixels with a boolean mask.  The current\r
- * color index is used for all pixels.\r
- */\r
-static void write_monoindex_span(GLcontext* ctx,\r
-                                                                GLuint n,GLint x,GLint y,\r
-                                                                const GLubyte mask[])\r
-{\r
-         STARTPROFILE\r
-         GLuint i;\r
-         BYTE *Mem=Current->ScreenMem+FLIP(y)*Current->ScanWidth+x;\r
-         assert(Current->rgb_flag==GL_FALSE);\r
-         for (i=0; i<n; i++)\r
-               if (mask[i])\r
-                 Mem[i]=Current->pixel;\r
-         ENDPROFILE(write_monoindex_span)\r
-}\r
-\r
-/*\r
-       To improve the performance of this routine, frob the data into an actual scanline\r
-       and call bitblt on the complete scan line instead of SetPixel.\r
-*/\r
-\r
-/* Write a horizontal span of color pixels with a boolean mask. */\r
-static void write_color_span( GLcontext* ctx,\r
-                         GLuint n, GLint x, GLint y,\r
-                         const GLubyte\r
-                         red[], const GLubyte green[],\r
-                         const GLubyte blue[], const GLubyte alpha[],\r
-                         const GLubyte mask[] )\r
-{\r
-       STARTPROFILE\r
-\r
-       PWMC    pwc = Current;\r
-\r
-       if (pwc->rgb_flag==GL_TRUE)\r
-       {\r
-               GLuint i;\r
-               HDC DC=DD_GETDC;\r
-               y=FLIP(y);\r
-\r
-               if (mask) {\r
-                       for (i=0; i<n; i++)\r
-                               if (mask[i])\r
-                                       wmSetPixel(pwc, y, x + i,red[i], green[i], blue[i]);\r
-               }\r
-\r
-               else {\r
-                       for (i=0; i<n; i++)\r
-                               wmSetPixel(pwc, y, x + i, red[i], green[i], blue[i]);\r
-               }\r
-\r
-               DD_RELEASEDC;\r
-\r
-       }\r
-\r
-  else\r
-  {\r
-               GLuint i;\r
-               BYTE *Mem=Current->ScreenMem+y*Current->ScanWidth+x;\r
-               y=FLIP(y);\r
-               if (mask) {\r
-                  for (i=0; i<n; i++)\r
-                        if (mask[i])\r
-                          Mem[i]=GetNearestPaletteIndex(Current->hPal,RGB(red[i],green[i],blue[i]));\r
-               }\r
-               else {\r
-                  for (i=0; i<n; i++)\r
-                        Mem[i]=GetNearestPaletteIndex(Current->hPal,RGB(red[i],green[i],blue[i]));\r
-                       }\r
-       }\r
-   ENDPROFILE(write_color_span)\r
-\r
-}\r
-\r
-/*\r
- * Write a horizontal span of pixels with a boolean mask.  The current color\r
- * is used for all pixels.\r
- */\r
-static void write_monocolor_span( GLcontext* ctx,\r
-                                                                 GLuint n, GLint x, GLint y,\r
-                                                                 const GLubyte mask[])\r
-{\r
-  STARTPROFILE\r
-  GLuint i;\r
-  HDC DC=DD_GETDC;\r
-  PWMC pwc = Current;\r
-\r
-  assert(Current->rgb_flag==GL_TRUE);\r
-  y=FLIP(y);\r
-\r
-  if(Current->rgb_flag==GL_TRUE){\r
-         for (i=0; i<n; i++)\r
-               if (mask[i])\r
-// Trying\r
-               wmSetPixel(pwc,y,x+i,GetRValue(Current->pixel), GetGValue(Current->pixel), GetBValue(Current->pixel));\r
-  }\r
-  else {\r
-         for (i=0; i<n; i++)\r
-               if (mask[i])\r
-                       SetPixel(DC, y, x+i, Current->pixel);\r
-  }\r
-\r
-       DD_RELEASEDC;\r
-\r
-       ENDPROFILE(write_monocolor_span)\r
-}\r
-\r
-\r
-\r
-/**********************************************************************/\r
-/*****                   Array-based pixel drawing                *****/\r
-/**********************************************************************/\r
-\r
-\r
-/* Write an array of pixels with a boolean mask. */\r
-static void write_index_pixels( GLcontext* ctx,\r
-                                                           GLuint n, const GLint x[], const GLint y[],\r
-                                                               const GLuint index[], const GLubyte mask[] )\r
-{\r
-   STARTPROFILE\r
-   GLuint i;\r
-   assert(Current->rgb_flag==GL_FALSE);\r
-   for (i=0; i<n; i++) {\r
-      if (mask[i]) {\r
-         BYTE *Mem=Current->ScreenMem+FLIP(y[i])*Current->ScanWidth+x[i];\r
-                  *Mem = index[i];\r
-      }\r
-   }\r
-   ENDPROFILE(write_index_pixels)\r
-}\r
-\r
-\r
-\r
-/*\r
- * Write an array of pixels with a boolean mask.  The current color\r
- * index is used for all pixels.\r
- */\r
-static void write_monoindex_pixels( GLcontext* ctx,\r
-                                                                   GLuint n,\r
-                                                                       const GLint x[], const GLint y[],\r
-                                    const GLubyte mask[] )\r
-{\r
-   STARTPROFILE\r
-   GLuint i;\r
-   assert(Current->rgb_flag==GL_FALSE);\r
-   for (i=0; i<n; i++) {\r
-      if (mask[i]) {\r
-         BYTE *Mem=Current->ScreenMem+FLIP(y[i])*Current->ScanWidth+x[i];\r
-                       *Mem = Current->pixel;\r
-      }\r
-   }\r
-   ENDPROFILE(write_monoindex_pixels)\r
-}\r
-\r
-\r
-\r
-/* Write an array of pixels with a boolean mask. */\r
-static void write_color_pixels( GLcontext* ctx,\r
-                                                           GLuint n, const GLint x[], const GLint y[],\r
-                                                               const GLubyte r[], const GLubyte g[],\r
-                                const GLubyte b[], const GLubyte a[],\r
-                                const GLubyte mask[] )\r
-{\r
-       STARTPROFILE\r
-       GLuint i;\r
-       PWMC    pwc = Current;\r
-       HDC DC=DD_GETDC;\r
-       assert(Current->rgb_flag==GL_TRUE);\r
-       for (i=0; i<n; i++)\r
-               if (mask[i])\r
-                       wmSetPixel(pwc, FLIP(y[i]),x[i],r[i],g[i],b[i]);\r
-       DD_RELEASEDC;\r
-       ENDPROFILE(write_color_pixels)\r
-}\r
-\r
-\r
-\r
-/*\r
- * Write an array of pixels with a boolean mask.  The current color\r
- * is used for all pixels.\r
- */\r
-static void write_monocolor_pixels( GLcontext* ctx,\r
-                                                                   GLuint n,\r
-                                                                       const GLint x[], const GLint y[],\r
-                                    const GLubyte mask[] )\r
-{\r
-       STARTPROFILE\r
-       GLuint i;\r
-       PWMC    pwc = Current;\r
-       HDC DC=DD_GETDC;\r
-       assert(Current->rgb_flag==GL_TRUE);\r
-       for (i=0; i<n; i++)\r
-               if (mask[i])\r
-                       wmSetPixel(pwc, FLIP(y[i]),x[i],GetRValue(Current->pixel),\r
-                                           GetGValue(Current->pixel), GetBValue(Current->pixel));\r
-       DD_RELEASEDC;\r
-       ENDPROFILE(write_monocolor_pixels)\r
-}\r
-\r
-\r
-\r
-/**********************************************************************/\r
-/*****            Read spans/arrays of pixels                     *****/\r
-/**********************************************************************/\r
-\r
-\r
-/* Read a horizontal span of color-index pixels. */\r
-static void read_index_span( GLcontext* ctx, GLuint n, GLint x, GLint y, GLuint index[])\r
-{\r
-  STARTPROFILE\r
-  GLuint i;\r
-  BYTE *Mem=Current->ScreenMem+FLIP(y)*Current->ScanWidth+x;\r
-  assert(Current->rgb_flag==GL_FALSE);\r
-  for (i=0; i<n; i++)\r
-    index[i]=Mem[i];\r
-  ENDPROFILE(read_index_span)\r
-\r
-}\r
-\r
-\r
-\r
-\r
-/* Read an array of color index pixels. */\r
-static void read_index_pixels( GLcontext* ctx,\r
-                                                          GLuint n, const GLint x[], const GLint y[],\r
-                                                          GLuint indx[], const GLubyte mask[] )\r
-{\r
-   STARTPROFILE\r
-   GLuint i;\r
-  assert(Current->rgb_flag==GL_FALSE);\r
-  for (i=0; i<n; i++) {\r
-     if (mask[i]) {\r
-        indx[i]=*(Current->ScreenMem+FLIP(y[i])*Current->ScanWidth+x[i]);\r
-     }\r
-  }\r
-   ENDPROFILE(read_index_pixels)\r
-}\r
-\r
-\r
-\r
-/* Read a horizontal span of color pixels. */\r
-static void read_color_span( GLcontext* ctx,\r
-                                                        GLuint n, GLint x, GLint y,\r
-                                                        GLubyte red[], GLubyte green[],\r
-                             GLubyte blue[], GLubyte alpha[] )\r
-{\r
-   STARTPROFILE\r
-  UINT i;\r
-  COLORREF Color;\r
-  HDC DC=DD_GETDC;\r
-  assert(Current->rgb_flag==GL_TRUE);\r
-  y=FLIP(y);\r
-  for (i=0; i<n; i++)\r
-  {\r
-    Color=GetPixel(DC,x+i,y);\r
-    red[i]=GetRValue(Color);\r
-    green[i]=GetGValue(Color);\r
-    blue[i]=GetBValue(Color);\r
-    alpha[i]=255;\r
-  }\r
-  DD_RELEASEDC;\r
-  memset(alpha,0,n*sizeof(GLint));\r
-   ENDPROFILE(read_color_span)\r
-}\r
-\r
-\r
-/* Read an array of color pixels. */\r
-static void read_color_pixels( GLcontext* ctx,\r
-                                                          GLuint n, const GLint x[], const GLint y[],\r
-                                                          GLubyte red[], GLubyte green[],\r
-                               GLubyte blue[], GLubyte alpha[],\r
-                               const GLubyte mask[] )\r
-{\r
-   STARTPROFILE\r
-  GLuint i;\r
-  COLORREF Color;\r
-  HDC DC=DD_GETDC;\r
-  assert(Current->rgb_flag==GL_TRUE);\r
-  for (i=0; i<n; i++) {\r
-     if (mask[i]) {\r
-        Color=GetPixel(DC,x[i],FLIP(y[i]));\r
-        red[i]=GetRValue(Color);\r
-        green[i]=GetGValue(Color);\r
-        blue[i]=GetBValue(Color);\r
-        alpha[i]=255;\r
-     }\r
-  }\r
-  DD_RELEASEDC;\r
-  memset(alpha,0,n*sizeof(GLint));\r
-   ENDPROFILE(read_color_pixels)\r
-}\r
-\r
-\r
-\r
-/**********************************************************************/\r
-/**********************************************************************/\r
-\r
-\r
-\r
-void setup_DD_pointers( GLcontext* ctx )\r
-{\r
-   ctx->Driver.UpdateState = setup_DD_pointers;\r
-   ctx->Driver.GetBufferSize = buffer_size;\r
-   ctx->Driver.Finish = finish;\r
-   ctx->Driver.Flush = flush;\r
-\r
-   ctx->Driver.ClearIndex = clear_index;\r
-   ctx->Driver.ClearColor = clear_color;\r
-   ctx->Driver.Clear = clear;\r
-\r
-   ctx->Driver.Index = set_index;\r
-   ctx->Driver.Color = set_color;\r
-   ctx->Driver.IndexMask = index_mask;\r
-   ctx->Driver.ColorMask = color_mask;\r
-\r
-   ctx->Driver.LogicOp = logicop;\r
-   ctx->Driver.Dither = dither;\r
-\r
-   ctx->Driver.SetBuffer = set_buffer;\r
-   ctx->Driver.GetBufferSize = buffer_size;\r
-\r
-   ctx->Driver.PointsFunc = choose_points_function(ctx);\r
-   ctx->Driver.LineFunc = choose_line_function(ctx);\r
-   ctx->Driver.TriangleFunc = choose_triangle_function( ctx );\r
-\r
-   /* Pixel/span writing functions: */\r
-   ctx->Driver.WriteColorSpan       = write_color_span;\r
-   ctx->Driver.WriteMonocolorSpan   = write_monocolor_span;\r
-   ctx->Driver.WriteColorPixels     = write_color_pixels;\r
-   ctx->Driver.WriteMonocolorPixels = write_monocolor_pixels;\r
-   ctx->Driver.WriteIndexSpan       = write_index_span;\r
-   ctx->Driver.WriteMonoindexSpan   = write_monoindex_span;\r
-   ctx->Driver.WriteIndexPixels     = write_index_pixels;\r
-   ctx->Driver.WriteMonoindexPixels = write_monoindex_pixels;\r
-\r
-   /* Pixel/span reading functions: */\r
-   ctx->Driver.ReadIndexSpan = read_index_span;\r
-   ctx->Driver.ReadColorSpan = read_color_span;\r
-   ctx->Driver.ReadIndexPixels = read_index_pixels;\r
-   ctx->Driver.ReadColorPixels = read_color_pixels;\r
-}\r
-\r
-\r
-/**********************************************************************/\r
-/*****                  WMesa API Functions                       *****/\r
-/**********************************************************************/\r
-\r
-\r
-\r
-#define PAL_SIZE 256\r
-static void GetPalette(HPALETTE Pal,RGBQUAD *aRGB)\r
-{\r
-   STARTPROFILE\r
-       int i;\r
-       HDC hdc;\r
-       struct\r
-       {\r
-               WORD Version;\r
-               WORD NumberOfEntries;\r
-               PALETTEENTRY aEntries[PAL_SIZE];\r
-       } Palette =\r
-       {\r
-               0x300,\r
-               PAL_SIZE\r
-       };\r
-       hdc=GetDC(NULL);\r
-       if (Pal!=NULL)\r
-    GetPaletteEntries(Pal,0,PAL_SIZE,Palette.aEntries);\r
-  else\r
-    GetSystemPaletteEntries(hdc,0,PAL_SIZE,Palette.aEntries);\r
-       if (GetSystemPaletteUse(hdc) == SYSPAL_NOSTATIC)\r
-       {\r
-               for(i = 0; i <PAL_SIZE; i++)\r
-                       Palette.aEntries[i].peFlags = PC_RESERVED;\r
-               Palette.aEntries[255].peRed = 255;\r
-               Palette.aEntries[255].peGreen = 255;\r
-               Palette.aEntries[255].peBlue = 255;\r
-               Palette.aEntries[255].peFlags = 0;\r
-               Palette.aEntries[0].peRed = 0;\r
-               Palette.aEntries[0].peGreen = 0;\r
-               Palette.aEntries[0].peBlue = 0;\r
-               Palette.aEntries[0].peFlags = 0;\r
-       }\r
-       else\r
-       {\r
-               int nStaticColors;\r
-               int nUsableColors;\r
-               nStaticColors = GetDeviceCaps(hdc, NUMCOLORS)/2;\r
-               for (i=0; i<nStaticColors; i++)\r
-                       Palette.aEntries[i].peFlags = 0;\r
-               nUsableColors = PAL_SIZE-nStaticColors;\r
-               for (; i<nUsableColors; i++)\r
-                       Palette.aEntries[i].peFlags = PC_RESERVED;\r
-               for (; i<PAL_SIZE-nStaticColors; i++)\r
-                       Palette.aEntries[i].peFlags = PC_RESERVED;\r
-               for (i=PAL_SIZE-nStaticColors; i<PAL_SIZE; i++)\r
-                       Palette.aEntries[i].peFlags = 0;\r
-       }\r
-       ReleaseDC(NULL,hdc);\r
-  for (i=0; i<PAL_SIZE; i++)\r
-  {\r
-    aRGB[i].rgbRed=Palette.aEntries[i].peRed;\r
-    aRGB[i].rgbGreen=Palette.aEntries[i].peGreen;\r
-    aRGB[i].rgbBlue=Palette.aEntries[i].peBlue;\r
-    aRGB[i].rgbReserved=Palette.aEntries[i].peFlags;\r
-  }\r
-         ENDPROFILE(GetPalette)\r
-}\r
-\r
-\r
-WMesaContext WMesaCreateContext( HWND hWnd, HPALETTE* Pal,\r
-                                                                                         GLboolean rgb_flag,\r
-                                                                                         GLboolean db_flag )\r
-{\r
-  RECT CR;\r
-  WMesaContext c;\r
-  GLboolean true_color_flag;\r
-  c = (struct wmesa_context * ) calloc(1,sizeof(struct wmesa_context));\r
-  if (!c)\r
-    return NULL;\r
-\r
-  c->Window=hWnd;\r
-  c->hDC = GetDC(hWnd);\r
-  true_color_flag = GetDeviceCaps(c->hDC, BITSPIXEL) > 8;\r
-#ifdef DDRAW\r
-  if(true_color_flag) c->rgb_flag = rgb_flag = GL_TRUE;\r
-#endif\r
-\r
-\r
-#ifdef DITHER\r
-  if ((true_color_flag==GL_FALSE) && (rgb_flag == GL_TRUE)){\r
-       c->dither_flag = GL_TRUE;\r
-       c->hPalHalfTone = WinGCreateHalftonePalette();\r
-  }\r
-  else\r
-       c->dither_flag = GL_FALSE;\r
-#else\r
-       c->dither_flag = GL_FALSE;\r
-#endif\r
-\r
-\r
-  if (rgb_flag==GL_FALSE)\r
-  {\r
-    c->rgb_flag = GL_FALSE;\r
-//    c->pixel = 1;\r
-    c->db_flag = db_flag =GL_TRUE; // WinG requires double buffering\r
-       printf("Single buffer is not supported in color index mode, setting to double buffer.\n");\r
-  }\r
-  else\r
-  {\r
-    c->rgb_flag = GL_TRUE;\r
-//    c->pixel = 0;\r
-  }\r
-  GetClientRect(c->Window,&CR);\r
-  c->width=CR.right;\r
-  c->height=CR.bottom;\r
-  if (db_flag)\r
-  {\r
-    c->db_flag = 1;\r
-       /* Double buffered */\r
-#ifndef DDRAW\r
-//     if (c->rgb_flag==GL_TRUE && c->dither_flag != GL_TRUE )\r
-    {\r
-               wmCreateBackingStore(c, c->width, c->height);\r
-\r
-    }\r
-#endif\r
-  }\r
-  else\r
-  {\r
-    /* Single Buffered */\r
-       if (c->rgb_flag)\r
-         c->db_flag = 0;\r
-  }\r
-#ifdef DDRAW\r
-  if (DDInit(c,hWnd) == GL_FALSE) {\r
-               free( (void *) c );\r
-               exit(1);\r
-               }\r
-#endif\r
-\r
-\r
-  c->gl_visual = gl_create_visual(rgb_flag,\r
-                                                                 GL_FALSE,     /* software alpha */\r
-                                  db_flag,     /* db_flag */\r
-                                  16,          /* depth_bits */\r
-                                  8,           /* stencil_bits */\r
-                                  8,           /* accum_bits */\r
-                                  8,\r
-                                  255.0, 255.0, 255.0, 255.0,\r
-                                                                 8,8,8,8 );\r
-\r
-       if (!c->gl_visual) {\r
-         return NULL;\r
-      }\r
-\r
-  /* allocate a new Mesa context */\r
-  c->gl_ctx = gl_create_context( c->gl_visual, NULL,c);\r
-\r
-  if (!c->gl_ctx) {\r
-         gl_destroy_visual( c->gl_visual );\r
-         free(c);\r
-         return NULL;\r
-      }\r
-\r
-      c->gl_buffer = gl_create_framebuffer( c->gl_visual );\r
-      if (!c->gl_buffer) {\r
-         gl_destroy_visual( c->gl_visual );\r
-         gl_destroy_context( c->gl_ctx );\r
-         free(c);\r
-         return NULL;\r
-      }\r
-//  setup_DD_pointers(c->gl_ctx);\r
-\r
-  return c;\r
-}\r
-\r
-void WMesaDestroyContext( void )\r
-{\r
-       WMesaContext c = Current;\r
-       ReleaseDC(c->Window,c->hDC);\r
-       WC = c;\r
-       if(c->hPalHalfTone != NULL)\r
-               DeleteObject(c->hPalHalfTone);\r
-    gl_destroy_visual( c->gl_visual );\r
-    gl_destroy_framebuffer( c->gl_buffer );\r
-       gl_destroy_context( c->gl_ctx );\r
-\r
-       if (c->db_flag)\r
-#ifdef DDRAW\r
-               DDFree(c);\r
-#else\r
-               wmDeleteBackingStore(c);\r
-#endif\r
-       free( (void *) c );\r
-//Following code is added to enable parallel render\r
-// Parallel render only work in double buffer mode\r
-#if !defined(NO_PARALLEL)\r
-       if(parallelMachine)\r
-               PRDestroyRenderBuffer();\r
-#endif\r
-// End modification\r
-}\r
-\r
-\r
-\r
-void /*APIENTRY*/ WMesaMakeCurrent( WMesaContext c )\r
-{\r
-       if(!c){\r
-               Current = c;\r
-               return;\r
-       }\r
-\r
-       //\r
-       // A little optimization\r
-       // If it already is current,\r
-       // don't set it again\r
-       //\r
-       if(Current == c)\r
-               return;\r
-\r
-       //gl_set_context( c->gl_ctx );\r
-       gl_make_current(c->gl_ctx, c->gl_buffer);\r
-       Current = c;\r
-       setup_DD_pointers(c->gl_ctx);\r
-       if (Current->gl_ctx->Viewport.Width==0) {\r
-         /* initialize viewport to window size */\r
-         _mesa_set_viewport( Current->gl_ctx,\r
-                          0, 0, Current->width, Current->height );\r
-       }\r
-       if ((c->cColorBits <= 8 ) && (c->rgb_flag == GL_TRUE)){\r
-                       WMesaPaletteChange(c->hPalHalfTone);\r
-       }\r
-}\r
-\r
-\r
-\r
-void /*APIENTRY*/ WMesaSwapBuffers( void )\r
-{\r
-  HDC DC = Current->hDC;\r
-  if (Current->db_flag)\r
-       wmFlush(Current);\r
-}\r
-\r
-\r
-\r
-void /*APIENTRY*/ WMesaPaletteChange(HPALETTE Pal)\r
-{\r
-  int vRet;\r
-  LPPALETTEENTRY pPal;\r
-  if (Current && (Current->rgb_flag==GL_FALSE || Current->dither_flag == GL_TRUE))\r
-  {\r
-       pPal = (PALETTEENTRY *)malloc( 256 * sizeof(PALETTEENTRY));\r
-       Current->hPal=Pal;\r
-//     GetPaletteEntries( Pal, 0, 256, pPal );\r
-       GetPalette( Pal, pPal );\r
-#ifdef DDRAW\r
-       Current->lpDD->lpVtbl->CreatePalette(Current->lpDD,DDPCAPS_8BIT,\r
-               pPal, &(Current->lpDDPal), NULL);\r
-       if (Current->lpDDPal)\r
-        Current->lpDDSPrimary->lpVtbl->SetPalette(Current->lpDDSPrimary,Current->lpDDPal);\r
-#else\r
-    vRet = SetDIBColorTable(Current->dib.hDC,0,256,pPal);\r
-#endif\r
-       free( pPal );\r
-  }\r
-\r
-}\r
-\r
-\r
-\r
-\r
-static unsigned char threeto8[8] = {\r
-       0, 0111>>1, 0222>>1, 0333>>1, 0444>>1, 0555>>1, 0666>>1, 0377\r
-};\r
-\r
-static unsigned char twoto8[4] = {\r
-       0, 0x55, 0xaa, 0xff\r
-};\r
-\r
-static unsigned char oneto8[2] = {\r
-       0, 255\r
-};\r
-\r
-static unsigned char componentFromIndex(UCHAR i, UINT nbits, UINT shift)\r
-{\r
-       unsigned char val;\r
-\r
-       val = i >> shift;\r
-       switch (nbits) {\r
-\r
-               case 1:\r
-                       val &= 0x1;\r
-                       return oneto8[val];\r
-\r
-               case 2:\r
-                       val &= 0x3;\r
-                       return twoto8[val];\r
-\r
-               case 3:\r
-                       val &= 0x7;\r
-                       return threeto8[val];\r
-\r
-               default:\r
-                       return 0;\r
-       }\r
-}\r
-\r
-void /*WINAPI*/ wmCreatePalette( PWMC pwdc )\r
-{\r
-    /* Create a compressed and re-expanded 3:3:2 palette */\r
-       int            i;\r
-       LOGPALETTE     *pPal;\r
-    BYTE           rb, rs, gb, gs, bb, bs;\r
-\r
-    pwdc->nColors = 0x100;\r
-\r
-       pPal = (PLOGPALETTE)malloc(sizeof(LOGPALETTE) + pwdc->nColors * sizeof(PALETTEENTRY));\r
-    memset( pPal, 0, sizeof(LOGPALETTE) + pwdc->nColors * sizeof(PALETTEENTRY) );\r
-\r
-       pPal->palVersion = 0x300;\r
-\r
-    rb = REDBITS;\r
-    rs = REDSHIFT;\r
-    gb = GREENBITS;\r
-    gs = GREENSHIFT;\r
-    bb = BLUEBITS;\r
-    bs = BLUESHIFT;\r
-\r
-    if (pwdc->db_flag) {\r
-\r
-        /* Need to make two palettes: one for the screen DC and one for the DIB. */\r
-           pPal->palNumEntries = pwdc->nColors;\r
-           for (i = 0; i < pwdc->nColors; i++) {\r
-                   pPal->palPalEntry[i].peRed = componentFromIndex( i, rb, rs );\r
-                   pPal->palPalEntry[i].peGreen = componentFromIndex( i, gb, gs );\r
-                   pPal->palPalEntry[i].peBlue = componentFromIndex( i, bb, bs );\r
-                   pPal->palPalEntry[i].peFlags = 0;\r
-           }\r
-       pwdc->hGLPalette = CreatePalette( pPal );\r
-       pwdc->hPalette = CreatePalette( pPal );\r
-    }\r
-\r
-       else {\r
-           pPal->palNumEntries = pwdc->nColors;\r
-           for (i = 0; i < pwdc->nColors; i++) {\r
-                   pPal->palPalEntry[i].peRed = componentFromIndex( i, rb, rs );\r
-                   pPal->palPalEntry[i].peGreen = componentFromIndex( i, gb, gs );\r
-                   pPal->palPalEntry[i].peBlue = componentFromIndex( i, bb, bs );\r
-                   pPal->palPalEntry[i].peFlags = 0;\r
-           }\r
-       pwdc->hGLPalette = CreatePalette( pPal );\r
-    }\r
-\r
-       free(pPal);\r
-\r
-}\r
-\r
-void /*WINAPI*/ wmSetPixel(PWMC pwc, int iScanLine, int iPixel, BYTE r, BYTE g, BYTE b)\r
-{\r
-       if(Current->db_flag){\r
-               LPBYTE  lpb = pwc->pbPixels;\r
-               LPDWORD lpdw;\r
-               LPWORD  lpw;\r
-               UINT    nBypp = pwc->cColorBits / 8;\r
-               UINT    nOffset = iPixel % nBypp;\r
-\r
-               // Move the pixel buffer pointer to the scanline that we\r
-               // want to access\r
-\r
-//             pwc->dib.fFlushed = FALSE;\r
-\r
-               lpb += pwc->ScanWidth * iScanLine;\r
-               // Now move to the desired pixel\r
-               lpb += iPixel * nBypp;\r
-               lpb = PIXELADDR(iPixel, iScanLine);\r
-               lpdw = (LPDWORD)lpb;\r
-               lpw = (LPWORD)lpb;\r
-\r
-               if(nBypp == 1){\r
-                       if(pwc->dither_flag)\r
-                               *lpb = DITHER_RGB_2_8BIT(r,g,b,iScanLine,iPixel);\r
-                       else\r
-                               *lpb = BGR8(r,g,b);\r
-               }\r
-               else if(nBypp == 2)\r
-                       *lpw = BGR16(r,g,b);\r
-               else if (nBypp == 3){\r
-                       *lpdw = BGR24(r,g,b);\r
-               }\r
-               else if (nBypp == 4)\r
-                       *lpdw = BGR32(r,g,b);\r
-       }\r
-       else{\r
-               HDC DC = DD_GETDC;\r
-               SetPixel(DC, iPixel, iScanLine, RGB(r,g,b));\r
-               DD_RELEASEDC;\r
-       }\r
-}\r
-\r
-void /*WINAPI*/ wmCreateDIBSection(\r
-       HDC      hDC,\r
-    PWMC pwc,  // handle of device context\r
-    CONST BITMAPINFO *pbmi,    // address of structure containing bitmap size, format, and color data\r
-    UINT iUsage        // color data type indicator: RGB values or palette indices\r
-)\r
-{\r
-       DWORD   dwSize = 0;\r
-       DWORD   dwScanWidth;\r
-       UINT    nBypp = pwc->cColorBits / 8;\r
-       HDC             hic;\r
-\r
-       dwScanWidth = (((pwc->ScanWidth * nBypp)+ 3) & ~3);\r
-\r
-       pwc->ScanWidth =pwc->pitch = dwScanWidth;\r
-\r
-       if (stereo_flag)\r
-               pwc->ScanWidth = 2* pwc->pitch;\r
-\r
-       dwSize = sizeof(BITMAPINFO) + (dwScanWidth * pwc->height);\r
-\r
-       pwc->dib.hFileMap = CreateFileMapping((HANDLE)PAGE_FILE,\r
-                                                                                 NULL,\r
-                                                                                 PAGE_READWRITE | SEC_COMMIT,\r
-                                                                                 0,\r
-                                                                                 dwSize,\r
-                                                                                 NULL);\r
-\r
-       if (!pwc->dib.hFileMap)\r
-               return;\r
-\r
-       pwc->dib.base = MapViewOfFile(pwc->dib.hFileMap,\r
-                                                                 FILE_MAP_ALL_ACCESS,\r
-                                                                 0,\r
-                                                                 0,\r
-                                                                 0);\r
-\r
-       if(!pwc->dib.base){\r
-               CloseHandle(pwc->dib.hFileMap);\r
-               return;\r
-       }\r
-\r
-//     pwc->pbPixels = pwc->addrOffScreen = ((LPBYTE)pwc->dib.base) + sizeof(BITMAPINFO);\r
-\r
-//     pwc->dib.hDC = CreateCompatibleDC(hDC);\r
-\r
-       CopyMemory(pwc->dib.base, pbmi, sizeof(BITMAPINFO));\r
-\r
-       hic = CreateIC("display", NULL, NULL, NULL);\r
-       pwc->dib.hDC = CreateCompatibleDC(hic);\r
-\r
-\r
-/*     pwc->hbmDIB = CreateDIBitmap(hic,\r
-                                                &(pwc->bmi.bmiHeader),\r
-                                                CBM_INIT,\r
-                                                pwc->pbPixels,\r
-                                                &(pwc->bmi),\r
-                                                DIB_RGB_COLORS);\r
-*/\r
-  pwc->hbmDIB = CreateDIBSection(hic,\r
-                                               &(pwc->bmi),\r
-                                               (iUsage ? DIB_PAL_COLORS : DIB_RGB_COLORS),\r
-                                               &(pwc->pbPixels),\r
-                                               pwc->dib.hFileMap,\r
-                                               0);\r
-  /*\r
-       pwc->hbmDIB = CreateDIBSection(hic,\r
-                                               &(pwc->bmi),\r
-                                               DIB_RGB_COLORS,\r
-                                               &(pwc->pbPixels),\r
-                                               pwc->dib.hFileMap,\r
-                                               0);\r
-       */\r
-       pwc->ScreenMem = pwc->addrOffScreen = pwc->pbPixels;\r
-       pwc->hOldBitmap = SelectObject(pwc->dib.hDC, pwc->hbmDIB);\r
-\r
-       DeleteDC(hic);\r
-\r
-       return;\r
-\r
-}\r
-\r
-//\r
-// Blit memory DC to screen DC\r
-//\r
-BOOL /*WINAPI*/ wmFlush(PWMC pwc)\r
-{\r
-       BOOL    bRet = 0;\r
-       DWORD   dwErr = 0;\r
-       HRESULT             ddrval;\r
-\r
-    // Now search through the torus frames and mark used colors\r
-       if(pwc->db_flag){\r
-#ifdef DDRAW\r
-               if (pwc->lpDDSOffScreen == NULL)\r
-               if(DDCreateOffScreen(pwc) == GL_FALSE)\r
-                       return;\r
-\r
-               pwc->lpDDSOffScreen->lpVtbl->Unlock(pwc->lpDDSOffScreen, NULL);\r
-\r
-               while( 1 )\r
-               {\r
-                       ddrval = pwc->lpDDSPrimary->lpVtbl->Blt( pwc->lpDDSPrimary,\r
-                                       &(pwc->rectSurface), pwc->lpDDSOffScreen, &(pwc->rectOffScreen), 0, NULL );\r
-\r
-                       if( ddrval == DD_OK )\r
-                       {\r
-                               break;\r
-                       }\r
-                       if( ddrval == DDERR_SURFACELOST )\r
-                       {\r
-                               if(!DDRestoreAll(pwc))\r
-                               {\r
-                                       break;\r
-                               }\r
-                       }\r
-                       if( ddrval != DDERR_WASSTILLDRAWING )\r
-                       {\r
-                               break;\r
-                       }\r
-               }\r
-\r
-               while (pwc->lpDDSOffScreen->lpVtbl->Lock(pwc->lpDDSOffScreen,\r
-                                               NULL, &(pwc->ddsd), 0, NULL) == DDERR_WASSTILLDRAWING)\r
-                       ;\r
-\r
-               if(ddrval != DD_OK)\r
-               dwErr = GetLastError();\r
-#else\r
-       bRet = BitBlt(pwc->hDC, 0, 0, pwc->width, pwc->height,\r
-                  pwc->dib.hDC, 0, 0, SRCCOPY);\r
-#endif\r
-       }\r
-\r
-       return(TRUE);\r
-\r
-}\r
-\r
-\r
-// The following code is added by Li Wei to enable stereo display\r
-\r
-#if !defined(NO_STEREO)\r
-\r
-void WMesaShowStereo(GLuint list)\r
-{\r
-\r
-       GLbitfield mask = GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT;\r
-       GLfloat cm[16];\r
-       GLint matrix_mode;\r
-       // Must use double Buffer\r
-       if( ! Current-> db_flag )\r
-               return;\r
-\r
-\r
-    glGetIntegerv(GL_MATRIX_MODE,&matrix_mode);\r
-\r
-//     glPushMatrix();  //****\r
-       WMesaViewport(Current->gl_ctx,0,Current->height/2,Current->width,Current->height/2);\r
-//     Current->gl_ctx->NewState = 0;\r
-\r
-       //      glViewport(0,0,Current->width,Current->height/2);\r
-       if(matrix_mode!=GL_MODELVIEW)\r
-        glMatrixMode(GL_MODELVIEW);\r
-\r
-       glGetFloatv(GL_MODELVIEW_MATRIX,cm);\r
-       glLoadIdentity();\r
-       gluLookAt(viewDistance/2,0.0,0.0 ,\r
-                        viewDistance/2,0.0,-1.0,\r
-                        0.0,1.0,0.0 );\r
-//     glTranslatef(viewDistance/2.0,0.,0.);\r
-       glMultMatrixf( cm );\r
-\r
-       Current->ScreenMem = Current->pbPixels = Current->addrOffScreen;\r
-       //glPushMatrix();\r
-       glCallList( list );\r
-       //glPopMatrix();\r
-\r
-    glGetFloatv(GL_MODELVIEW_MATRIX,cm);\r
-       glLoadIdentity();\r
-       gluLookAt(-viewDistance/2,0.0,0.0 ,\r
-                        -viewDistance/2,0.0,-1.0,\r
-                        0.0,1.0,0.0 );\r
-//     glTranslatef(-viewDistance/2.0,0.,0.);\r
-       glMultMatrixf(cm);\r
-\r
-       Current->ScreenMem = Current->pbPixels = Current->addrOffScreen + Current->pitch;\r
-       glCallList(list);\r
-       if(matrix_mode!=GL_MODELVIEW)\r
-               glMatrixMode(matrix_mode);\r
-\r
-//     glPopMatrix();\r
-       glFlush();\r
-\r
-       WMesaViewport(Current->gl_ctx,0,0,Current->width,Current->height);\r
-//     Current->gl_ctx->NewState = 0;\r
-       WMesaSwapBuffers();\r
-\r
-}\r
-\r
-void toggleStereoMode()\r
-{\r
-       if(!Current->db_flag)\r
-               return;\r
-       if(!stereo_flag){\r
-               stereo_flag = 1;\r
-               if(stereoBuffer==GL_FALSE)\r
-#if !defined(NO_PARALLEL)\r
-                       if(!parallelFlag)\r
-#endif\r
-               {\r
-                       Current->ScanWidth = Current->pitch*2;\r
-                       }\r
-       }\r
-       else {\r
-               stereo_flag = 0;\r
-#if !defined(NO_PARALLEL)\r
-               if(!parallelFlag)\r
-#endif\r
-               Current->ScanWidth = Current->pitch;\r
-               Current->pbPixels = Current->addrOffScreen;\r
-       }\r
-}\r
-\r
-/* if in stereo mode, the following function is called */\r
-void glShowStereo(GLuint list)\r
-{\r
-       WMesaShowStereo(list);\r
-}\r
-\r
-#endif // End if NO_STEREO not defined\r
-\r
-#if !defined(NO_PARALLEL)\r
-\r
-void toggleParallelMode(void)\r
-{\r
-       if(!parallelFlag){\r
-               parallelFlag = GL_TRUE;\r
-               if(parallelMachine==GL_FALSE){\r
-                               PRCreateRenderBuffer( Current->rgb_flag? GL_RGBA :GL_COLOR_INDEX,\r
-                                                                         Current->cColorBits/8,\r
-                                                                         Current->width ,Current->height,\r
-                                                                         Current->ScanWidth,\r
-                                                                         Current->rgb_flag? Current->pbPixels: Current->ScreenMem);\r
-                               parallelMachine = GL_TRUE;\r
-                               }\r
-               }\r
-       else {\r
-               parallelFlag = GL_FALSE;\r
-               if(parallelMachine==GL_TRUE){\r
-                               PRDestroyRenderBuffer();\r
-                               parallelMachine=GL_FALSE;\r
-                               ReadyForNextFrame = GL_TRUE;\r
-                               }\r
-\r
-/***********************************************\r
-// Seems something wrong!!!!\r
-************************************************/\r
-\r
-               WMesaMakeCurrent(Current);\r
-#if !defined(NO_STEREO)\r
-               stereo_flag = GL_FALSE ;\r
-#endif\r
-       }\r
-}\r
-\r
-void PRShowRenderResult(void)\r
-{\r
-       int flag = 0;\r
-if(!glImageRendered())\r
-               return;\r
-\r
-  if (parallelFlag)\r
-       {\r
-         WMesaSwapBuffers();\r
-        }\r
-\r
-}\r
-#endif //End if NO_PARALLEL not defined\r
-\r
-//end modification\r
-\r
-BYTE DITHER_RGB_2_8BIT( int red, int green, int blue, int pixel, int scanline)\r
-{\r
-    char unsigned redtemp, greentemp, bluetemp, paletteindex;\r
-\r
-       //*** now, look up each value in the halftone matrix\r
-    //*** using an 8x8 ordered dither.\r
-    redtemp = aDividedBy51[red]\r
-          + (aModulo51[red] > aHalftone8x8[(pixel%8)*8\r
-          + scanline%8]);\r
-    greentemp = aDividedBy51[(char unsigned)green]\r
-          + (aModulo51[green] > aHalftone8x8[\r
-          (pixel%8)*8 + scanline%8]);\r
-    bluetemp = aDividedBy51[(char unsigned)blue]\r
-          + (aModulo51[blue] > aHalftone8x8[\r
-          (pixel%8)*8 +scanline%8]);\r
-\r
-    //*** recombine the halftoned rgb values into a palette index\r
-    paletteindex =\r
-    redtemp + aTimes6[greentemp] + aTimes36[bluetemp];\r
-\r
-    //*** and translate through the wing halftone palette\r
-    //*** translation vector to give the correct value.\r
-    return aWinGHalftoneTranslation[paletteindex];\r
-}\r
-\r
-#ifdef DDRAW\r
-/*\r
- * restoreAll\r
- *\r
- * restore all lost objects\r
- */\r
-HRESULT DDRestoreAll( WMesaContext wc )\r
-{\r
-    HRESULT     ddrval;\r
-\r
-    ddrval = wc->lpDDSPrimary->lpVtbl->Restore(wc->lpDDSPrimary);\r
-    if( ddrval == DD_OK )\r
-    {\r
-        ddrval = wc->lpDDSOffScreen->lpVtbl->Restore(wc->lpDDSOffScreen);\r
-    }\r
-    return ddrval;\r
-\r
-} /* restoreAll */\r
-\r
-\r
-/*\r
- * This function is called if the initialization function fails\r
- */\r
-BOOL initFail( HWND hwnd, WMesaContext wc )\r
-{\r
-    DDFree(wc);\r
-    MessageBox( hwnd, "DirectDraw Init FAILED", "", MB_OK );\r
-    return FALSE;\r
-\r
-} /* initFail */\r
-\r
-\r
-static void DDDeleteOffScreen(WMesaContext wc)\r
-{\r
-               if( wc->lpDDSOffScreen != NULL )\r
-               {\r
-                       wc->lpDDSOffScreen->lpVtbl->Unlock(wc->lpDDSOffScreen,NULL);\r
-            wc->lpDDSOffScreen->lpVtbl->Release(wc->lpDDSOffScreen);\r
-            wc->lpDDSOffScreen = NULL;\r
-               }\r
-\r
-}\r
-\r
-static void DDFreePrimarySurface(WMesaContext wc)\r
-{\r
-               if( wc->lpDDSPrimary != NULL )\r
-               {\r
-                       if(wc->db_flag == GL_FALSE)\r
-                               wc->lpDDSPrimary->lpVtbl->ReleaseDC(wc->lpDDSPrimary, wc->hDC);\r
-                       wc->lpDDSPrimary->lpVtbl->Release(wc->lpDDSPrimary);\r
-            wc->lpDDSPrimary = NULL;\r
-               }\r
-}\r
-\r
-static BOOL DDCreatePrimarySurface(WMesaContext wc)\r
-{\r
-       HRESULT ddrval;\r
-       DDSCAPS             ddscaps;\r
-       wc->ddsd.dwSize = sizeof( wc->ddsd );\r
-    wc->ddsd.dwFlags = DDSD_CAPS;\r
-    wc->ddsd.ddsCaps.dwCaps =  DDSCAPS_PRIMARYSURFACE;\r
-\r
-    ddrval = wc->lpDD->lpVtbl->CreateSurface( wc->lpDD,&(wc->ddsd), &(wc->lpDDSPrimary), NULL );\r
-    if( ddrval != DD_OK )\r
-    {\r
-        return initFail(wc->hwnd , wc);\r
-    }\r
-       if(wc->db_flag == GL_FALSE)\r
-                wc->lpDDSPrimary->lpVtbl->GetDC(wc->lpDDSPrimary, wc->hDC);\r
-       return TRUE;\r
-}\r
-\r
-static BOOL DDCreateOffScreen(WMesaContext wc)\r
-{\r
-       POINT   pt;\r
-       HRESULT         ddrval;\r
-       if(wc->lpDD == NULL)\r
-               return FALSE;\r
-       GetClientRect( wc->hwnd, &(wc->rectOffScreen) );\r
-       wc->ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;\r
-    wc->ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;\r
-    wc->ddsd.dwHeight = wc->rectOffScreen.bottom - wc->rectOffScreen.top;\r
-    wc->ddsd.dwWidth = wc->rectOffScreen.right - wc->rectOffScreen.left;\r
-\r
-    ddrval = wc->lpDD->lpVtbl->CreateSurface( wc->lpDD, &(wc->ddsd), &(wc->lpDDSOffScreen), NULL );\r
-    if( ddrval != DD_OK )\r
-    {\r
-               return FALSE;\r
-    }\r
-\r
-       while (wc->lpDDSOffScreen->lpVtbl->Lock(wc->lpDDSOffScreen,NULL, &(wc->ddsd), 0, NULL) == DDERR_WASSTILLDRAWING)\r
-        ;\r
-//     while ((ddrval = wc->lpDDSOffScreen->lpVtbl->Lock(wc->lpDDSOffScreen,NULL, &(wc->ddsd), DDLOCK_SURFACEMEMORYPTR , NULL)) != DD_OK)\r
-               ;\r
-       if(wc->ddsd.lpSurface==NULL)\r
-               return initFail(wc->hwnd, wc);\r
-\r
-       wc->ScreenMem = wc->pbPixels = wc->addrOffScreen = (PBYTE)(wc->ddsd.lpSurface);\r
-       wc->ScanWidth = wc->pitch = wc->ddsd.lPitch;\r
-       if (stereo_flag)\r
-               wc->ScanWidth = wc->ddsd.lPitch*2;\r
-\r
-       GetClientRect( wc->hwnd, &(wc->rectSurface) );\r
-       pt.x = pt.y = 0;\r
-    ClientToScreen( wc->hwnd, &pt );\r
-    OffsetRect(&(wc->rectSurface), pt.x, pt.y);\r
-       wmSetPixelFormat(wc, wc->hDC);\r
-       return TRUE;\r
-}\r
-\r
-/*\r
- * doInit - do work required for every instance of the application:\r
- *                create the window, initialize data\r
- */\r
-static BOOL DDInit( WMesaContext wc, HWND hwnd)\r
-{\r
-    HRESULT             ddrval;\r
-       DWORD dwFrequency;\r
-\r
-       LPDIRECTDRAW            lpDD;           // DirectDraw object\r
-       LPDIRECTDRAW2            lpDD2;\r
-\r
-\r
-       wc->fullScreen = displayOptions.fullScreen;\r
-       wc->gMode = displayOptions.mode;\r
-       wc->hwnd = hwnd;\r
-       stereo_flag = displayOptions.stereo;\r
-       if(wc->db_flag!= GL_TRUE)\r
-               stereo_flag = GL_FALSE;\r
-    /*\r
-     * create the main DirectDraw object\r
-     */\r
-    ddrval = DirectDrawCreate( NULL, &(wc->lpDD), NULL );\r
-    if( ddrval != DD_OK )\r
-    {\r
-        return initFail(hwnd,wc);\r
-    }\r
-\r
-    // Get exclusive mode if requested\r
-    if(wc->fullScreen)\r
-    {\r
-        ddrval = wc->lpDD->lpVtbl->SetCooperativeLevel( wc->lpDD, hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN );\r
-    }\r
-    else\r
-    {\r
-        ddrval = wc->lpDD->lpVtbl->SetCooperativeLevel( wc->lpDD, hwnd, DDSCL_NORMAL );\r
-    }\r
-    if( ddrval != DD_OK )\r
-    {\r
-        return initFail(hwnd , wc);\r
-    }\r
-\r
-\r
-/*     ddrval = wc->lpDD->lpVtbl->QueryInterface(wc->lpDD, IID_IDirectDraw2,\r
-                       (LPVOID *)((wc->lpDD2)));\r
-\r
-*/\r
-       if(ddrval != DD_OK)\r
-        return initFail(hwnd , wc);\r
-\r
-\r
-   //ddrval = wc->lpDD->lpVtbl->GetDisplayMode( wc->lpDD, &(wc->ddsd));\r
- //  wc->lpDD2->lpVtbl->GetMonitorFrequency(wc->lpDD, &dwFrequency);\r
-    switch( wc->gMode )\r
-    {\r
-        case 1:  ddrval = wc->lpDD->lpVtbl->SetDisplayMode( wc->lpDD, 640, 480, displayOptions.bpp); break;\r
-        case 2:  ddrval = wc->lpDD->lpVtbl->SetDisplayMode( wc->lpDD, 800, 600, displayOptions.bpp); break;\r
-        case 3:  ddrval = wc->lpDD->lpVtbl->SetDisplayMode( wc->lpDD, 1024, 768, displayOptions.bpp); break;\r
-               case 4:  ddrval = wc->lpDD->lpVtbl->SetDisplayMode( wc->lpDD, 1152, 864, displayOptions.bpp); break;\r
-        case 5:  ddrval = wc->lpDD->lpVtbl->SetDisplayMode( wc->lpDD, 1280, 1024, displayOptions.bpp); break;\r
-    }\r
-\r
-    if( ddrval != DD_OK )\r
-    {\r
-               printf("Can't modify display mode, current mode used\n");\r
-//        return initFail(hwnd , wc);\r
-    }\r
-//ddrval = wc->lpDD->lpVtbl->GetDisplayMode( wc->lpDD, &(wc->ddsd));\r
-switch(ddrval){\r
-case DDERR_INVALIDOBJECT:\r
-       break;\r
-case DDERR_INVALIDPARAMS:\r
-       break;\r
-case DDERR_UNSUPPORTEDMODE:\r
-       ;\r
-}\r
-\r
-       if(DDCreatePrimarySurface(wc) == GL_FALSE)\r
-               return initFail(hwnd, wc);\r
-\r
-       if(wc->db_flag)\r
-               return DDCreateOffScreen(wc);\r
-} /* DDInit */\r
-\r
-static void DDFree( WMesaContext wc)\r
-{\r
-    if( wc->lpDD != NULL )\r
-    {\r
-               DDFreePrimarySurface(wc);\r
-               DDDeleteOffScreen(wc);\r
-        wc->lpDD->lpVtbl->Release(wc->lpDD);\r
-        wc->lpDD = NULL;\r
-    }\r
-    // Clean up the screen on exit\r
-    RedrawWindow( NULL, NULL, NULL, RDW_INVALIDATE | RDW_ERASE |\r
-                     RDW_ALLCHILDREN );\r
-\r
-}\r
-#endif\r
-\r
-void WMesaMove(void)\r
-{\r
-       WMesaContext wc = Current;\r
-       POINT   pt;\r
-       if (Current != NULL){\r
-               GetClientRect( wc->hwnd, &(wc->rectSurface) );\r
-               pt.x = pt.y = 0;\r
-               ClientToScreen( wc->hwnd, &pt );\r
-               OffsetRect(&(wc->rectSurface), pt.x, pt.y);\r
-       }\r
-}\r
-\r
-/*\r
- * Like PACK_8A8B8G8R() but don't use alpha.  This is usually an acceptable\r
- * shortcut.\r
- */\r
-#define PACK_8B8G8R( R, G, B )   ( ((B) << 16) | ((G) << 8) | (R) )\r
-\r
-\r
-/**********************************************************************/\r
-/***                   Triangle rendering                            ***/\r
-/**********************************************************************/\r
-\r
-\r
-\r
-/*\r
- * XImage, smooth, depth-buffered, PF_8A8B8G8R triangle.\r
- */\r
-static void smooth_8A8B8G8R_z_triangle( GLcontext *ctx,\r
-                                         GLuint v0, GLuint v1, GLuint v2,\r
-                                         GLuint pv )\r
-{\r
-WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;\r
-#define INTERP_Z 1\r
-#define INTERP_RGB 1\r
-#define PIXEL_ADDRESS(X,Y) PIXELADDR4(X,Y)\r
-#define PIXEL_TYPE GLuint\r
-//#define BYTES_PER_ROW (wmesa->xm_buffer->backimage->bytes_per_line)\r
-#define BYTES_PER_ROW (wmesa->ScanWidth)\r
-#define INNER_LOOP( LEFT, RIGHT, Y )                                   \\r
-{                                                                      \\r
-   GLint i, len = RIGHT-LEFT;                                          \\r
-   for (i=0;i<len;i++) {                                               \\r
-      GLdepth z = FixedToDepth(ffz);                                   \\r
-      if (z < zRow[i]) {                                               \\r
-         pRow[i] = PACK_8B8G8R( FixedToInt(ffr), FixedToInt(ffg),      \\r
-                                FixedToInt(ffb) );                     \\r
-         zRow[i] = z;                                                  \\r
-      }                                                                        \\r
-      ffr += fdrdx;  ffg += fdgdx;  ffb += fdbdx;                      \\r
-      ffz += fdzdx;                                                    \\r
-   }                                                                   \\r
-}\r
-#include "tritemp.h"\r
-}\r
-\r
-\r
-/*\r
- * XImage, smooth, depth-buffered, PF_8R8G8B triangle.\r
- */\r
-static void smooth_8R8G8B_z_triangle( GLcontext *ctx,\r
-                                         GLuint v0, GLuint v1, GLuint v2,\r
-                                         GLuint pv )\r
-{\r
-   WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;\r
-#define INTERP_Z 1\r
-#define INTERP_RGB 1\r
-#define PIXEL_ADDRESS(X,Y) PIXELADDR4(X,Y)\r
-#define PIXEL_TYPE GLuint\r
-//#define BYTES_PER_ROW (wmesa->xm_buffer->backimage->bytes_per_line)\r
-#define BYTES_PER_ROW (wmesa->ScanWidth)\r
-#define INNER_LOOP( LEFT, RIGHT, Y )                                   \\r
-{                                                                      \\r
-   GLint i, len = RIGHT-LEFT;                                          \\r
-   for (i=0;i<len;i++) {                                               \\r
-      GLdepth z = FixedToDepth(ffz);                                   \\r
-      if (z < zRow[i]) {                                               \\r
-         pRow[i] = PACK_8R8G8B( FixedToInt(ffr), FixedToInt(ffg),      \\r
-                                FixedToInt(ffb) );                     \\r
-         zRow[i] = z;                                                  \\r
-      }                                                                        \\r
-      ffr += fdrdx;  ffg += fdgdx;  ffb += fdbdx;                      \\r
-      ffz += fdzdx;                                                    \\r
-   }                                                                   \\r
-}\r
-#include "tritemp.h"\r
-}\r
-\r
-\r
-\r
-/*\r
- * XImage, smooth, depth-buffered, PF_5R6G5B triangle.\r
- */\r
-static void smooth_5R6G5B_z_triangle( GLcontext *ctx,\r
-                                         GLuint v0, GLuint v1, GLuint v2,\r
-                                         GLuint pv )\r
-{\r
-   WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;\r
-#define INTERP_Z 1\r
-#define INTERP_RGB 1\r
-#define PIXEL_ADDRESS(X,Y) PIXELADDR2(X,Y)\r
-#define PIXEL_TYPE GLushort\r
-//#define BYTES_PER_ROW (wmesa->xm_buffer->backimage->bytes_per_line)\r
-#define BYTES_PER_ROW (wmesa->ScanWidth)\r
-#define INNER_LOOP( LEFT, RIGHT, Y )                                   \\r
-{                                                                      \\r
-   GLint i, len = RIGHT-LEFT;                                          \\r
-   for (i=0;i<len;i++) {                                               \\r
-      GLdepth z = FixedToDepth(ffz);                                   \\r
-      if (z < zRow[i]) {                                               \\r
-         pRow[i] = PACK_5R6G5B( FixedToInt(ffr), FixedToInt(ffg),      \\r
-                                FixedToInt(ffb) );                     \\r
-         zRow[i] = z;                                                  \\r
-      }                                                                        \\r
-      ffr += fdrdx;  ffg += fdgdx;  ffb += fdbdx;                      \\r
-      ffz += fdzdx;                                                    \\r
-   }                                                                   \\r
-}\r
-#include "tritemp.h"\r
-}\r
-\r
-/*\r
- * XImage, flat, depth-buffered, PF_8A8B8G8R triangle.\r
- */\r
-static void flat_8A8B8G8R_z_triangle( GLcontext *ctx, GLuint v0,\r
-                                     GLuint v1, GLuint v2, GLuint pv )\r
-{\r
-   WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;\r
-#define INTERP_Z 1\r
-#define PIXEL_ADDRESS(X,Y) PIXELADDR4(X,Y)\r
-#define PIXEL_TYPE GLuint\r
-//#define BYTES_PER_ROW (wmesa->xm_buffer->backimage->bytes_per_line)\r
-#define BYTES_PER_ROW (wmesa->ScanWidth)\r
-#define SETUP_CODE                                     \\r
-   unsigned long p = PACK_8B8G8R( VB->Color[pv][0],    \\r
-                VB->Color[pv][1], VB->Color[pv][2] );\r
-#define INNER_LOOP( LEFT, RIGHT, Y )                                   \\r
-{                                                                      \\r
-   GLint i, len = RIGHT-LEFT;                                          \\r
-   for (i=0;i<len;i++) {                                               \\r
-      GLdepth z = FixedToDepth(ffz);                                   \\r
-      if (z < zRow[i]) {                                               \\r
-        pRow[i] = p;                                                   \\r
-         zRow[i] = z;                                                  \\r
-      }                                                                        \\r
-      ffz += fdzdx;                                                    \\r
-   }                                                                   \\r
-}\r
-#include "tritemp.h"\r
-}\r
-\r
-\r
-/*\r
- * XImage, flat, depth-buffered, PF_8R8G8B triangle.\r
- */\r
-static void flat_8R8G8B_z_triangle( GLcontext *ctx, GLuint v0, GLuint v1,\r
-                                    GLuint v2, GLuint pv )\r
-{\r
-   WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;\r
-#define INTERP_Z 1\r
-#define PIXEL_ADDRESS(X,Y) PIXELADDR4(X,Y)\r
-#define PIXEL_TYPE GLuint\r
-//#define BYTES_PER_ROW (wmesa->xm_buffer->backimage->bytes_per_line)\r
-#define BYTES_PER_ROW (wmesa->ScanWidth)\r
-#define SETUP_CODE                                     \\r
-   unsigned long p = PACK_8R8G8B( VB->Color[pv][0],    \\r
-                VB->Color[pv][1], VB->Color[pv][2] );\r
-#define INNER_LOOP( LEFT, RIGHT, Y )                   \\r
-{                                                      \\r
-   GLint i, len = RIGHT-LEFT;                          \\r
-   for (i=0;i<len;i++) {                               \\r
-      GLdepth z = FixedToDepth(ffz);                   \\r
-      if (z < zRow[i]) {                               \\r
-        pRow[i] = p;                                   \\r
-         zRow[i] = z;                                  \\r
-      }                                                        \\r
-      ffz += fdzdx;                                    \\r
-   }                                                   \\r
-}\r
-#include "tritemp.h"\r
-}\r
-\r
-\r
-/*\r
- * XImage, flat, depth-buffered, PF_5R6G5B triangle.\r
- */\r
-static void flat_5R6G5B_z_triangle( GLcontext *ctx, GLuint v0, GLuint v1,\r
-                                    GLuint v2, GLuint pv )\r
-{\r
-   WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;\r
-#define INTERP_Z 1\r
-#define PIXEL_ADDRESS(X,Y) PIXELADDR2(X,Y)\r
-#define PIXEL_TYPE GLushort\r
-//#define BYTES_PER_ROW (wmesa->xm_buffer->backimage->bytes_per_line)\r
-#define BYTES_PER_ROW (wmesa->ScanWidth)\r
-#define SETUP_CODE                                     \\r
-   unsigned long p = PACK_5R6G5B( VB->Color[pv][0],    \\r
-                VB->Color[pv][1], VB->Color[pv][2] );\r
-#define INNER_LOOP( LEFT, RIGHT, Y )                   \\r
-{                                                      \\r
-   GLint i, len = RIGHT-LEFT;                          \\r
-   for (i=0;i<len;i++) {                               \\r
-      GLdepth z = FixedToDepth(ffz);                   \\r
-      if (z < zRow[i]) {                               \\r
-        pRow[i] = p;                                   \\r
-         zRow[i] = z;                                  \\r
-      }                                                        \\r
-      ffz += fdzdx;                                    \\r
-   }                                                   \\r
-}\r
-#include "tritemp.h"\r
-}\r
-\r
-\r
-/*\r
- * XImage, smooth, NON-depth-buffered, PF_8A8B8G8R triangle.\r
- */\r
-static void smooth_8A8B8G8R_triangle( GLcontext *ctx, GLuint v0, GLuint v1,\r
-                                     GLuint v2, GLuint pv )\r
-{\r
-   WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;\r
-#define INTERP_RGB 1\r
-#define PIXEL_ADDRESS(X,Y) PIXELADDR4(X,Y)\r
-#define PIXEL_TYPE GLuint\r
-//#define BYTES_PER_ROW (wmesa->xm_buffer->backimage->bytes_per_line)\r
-#define BYTES_PER_ROW (wmesa->ScanWidth)\r
-#define INNER_LOOP( LEFT, RIGHT, Y )                                   \\r
-{                                                                      \\r
-   GLint xx;                                                           \\r
-   PIXEL_TYPE *pixel = pRow;                                           \\r
-   for (xx=LEFT;xx<RIGHT;xx++,pixel++) {                               \\r
-      *pixel = PACK_8B8G8R( FixedToInt(ffr), FixedToInt(ffg),          \\r
-                               FixedToInt(ffb) );                      \\r
-      ffr += fdrdx;  ffg += fdgdx;  ffb += fdbdx;                      \\r
-   }                                                                   \\r
-}\r
-#include "tritemp.h"\r
-}\r
-\r
-\r
-/*\r
- * XImage, smooth, NON-depth-buffered, PF_8R8G8B triangle.\r
- */\r
-static void smooth_8R8G8B_triangle( GLcontext *ctx, GLuint v0, GLuint v1,\r
-                                    GLuint v2, GLuint pv )\r
-{\r
-   WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;\r
-#define INTERP_RGB 1\r
-#define PIXEL_ADDRESS(X,Y) PIXELADDR4(X,Y)\r
-#define PIXEL_TYPE GLuint\r
-//#define BYTES_PER_ROW (wmesa->xm_buffer->backimage->bytes_per_line)\r
-#define BYTES_PER_ROW (wmesa->ScanWidth)\r
-#define INNER_LOOP( LEFT, RIGHT, Y )                                   \\r
-{                                                                      \\r
-   GLint xx;                                                           \\r
-   PIXEL_TYPE *pixel = pRow;                                           \\r
-   for (xx=LEFT;xx<RIGHT;xx++,pixel++) {                               \\r
-      *pixel = PACK_8R8G8B( FixedToInt(ffr), FixedToInt(ffg),          \\r
-                               FixedToInt(ffb) );                      \\r
-      ffr += fdrdx;  ffg += fdgdx;  ffb += fdbdx;                      \\r
-   }                                                                   \\r
-}\r
-#include "tritemp.h"\r
-}\r
-\r
-\r
-/*\r
- * XImage, smooth, NON-depth-buffered, PF_5R6G5B triangle.\r
- */\r
-static void smooth_5R6G5B_triangle( GLcontext *ctx, GLuint v0, GLuint v1,\r
-                                   GLuint v2, GLuint pv )\r
-{\r
-   WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;\r
-#define INTERP_RGB 1\r
-#define PIXEL_ADDRESS(X,Y) PIXELADDR2(X,Y)\r
-#define PIXEL_TYPE GLushort\r
-//#define BYTES_PER_ROW (wmesa->xm_buffer->backimage->bytes_per_line)\r
-#define BYTES_PER_ROW (wmesa->ScanWidth)\r
-#define INNER_LOOP( LEFT, RIGHT, Y )                                   \\r
-{                                                                      \\r
-   GLint xx;                                                           \\r
-   PIXEL_TYPE *pixel = pRow;                                           \\r
-   for (xx=LEFT;xx<RIGHT;xx++,pixel++) {                               \\r
-      *pixel = PACK_5R6G5B( FixedToInt(ffr), FixedToInt(ffg),          \\r
-                               FixedToInt(ffb) );                      \\r
-      ffr += fdrdx;  ffg += fdgdx;  ffb += fdbdx;                      \\r
-   }                                                                   \\r
-}\r
-#include "tritemp.h"\r
-}\r
-\r
-\r
-\r
-/*\r
- * XImage, flat, NON-depth-buffered, PF_8A8B8G8R triangle.\r
- */\r
-static void flat_8A8B8G8R_triangle( GLcontext *ctx, GLuint v0,\r
-                                   GLuint v1, GLuint v2, GLuint pv )\r
-{\r
-   WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;\r
-#define PIXEL_ADDRESS(X,Y) PIXELADDR4(X,Y)\r
-#define PIXEL_TYPE GLuint\r
-//#define BYTES_PER_ROW (wmesa->xm_buffer->backimage->bytes_per_line)\r
-#define BYTES_PER_ROW (wmesa->ScanWidth)\r
-#define SETUP_CODE                                     \\r
-   unsigned long p = PACK_8B8G8R( VB->Color[pv][0],    \\r
-                VB->Color[pv][1], VB->Color[pv][2] );\r
-#define INNER_LOOP( LEFT, RIGHT, Y )                   \\r
-{                                                      \\r
-   GLint xx;                                           \\r
-   PIXEL_TYPE *pixel = pRow;                           \\r
-   for (xx=LEFT;xx<RIGHT;xx++,pixel++) {               \\r
-      *pixel = p;                                      \\r
-   }                                                   \\r
-}\r
-#include "tritemp.h"\r
-}\r
-\r
-\r
-/*\r
- * XImage, flat, NON-depth-buffered, PF_8R8G8B triangle.\r
- */\r
-static void flat_8R8G8B_triangle( GLcontext *ctx, GLuint v0, GLuint v1,\r
-                                  GLuint v2, GLuint pv )\r
-{\r
-   WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;\r
-#define PIXEL_ADDRESS(X,Y) PIXELADDR4(X,Y)\r
-#define PIXEL_TYPE GLuint\r
-//#define BYTES_PER_ROW (wmesa->xm_buffer->backimage->bytes_per_line)\r
-#define BYTES_PER_ROW (wmesa->ScanWidth)\r
-#define SETUP_CODE                                     \\r
-   unsigned long p = PACK_8R8G8B( VB->Color[pv][0],    \\r
-                VB->Color[pv][1], VB->Color[pv][2] );\r
-#define INNER_LOOP( LEFT, RIGHT, Y )                   \\r
-{                                                      \\r
-   GLint xx;                                           \\r
-   PIXEL_TYPE *pixel = pRow;                           \\r
-   for (xx=LEFT;xx<RIGHT;xx++,pixel++) {               \\r
-      *pixel = p;                                      \\r
-   }                                                   \\r
-}\r
-#include "tritemp.h"\r
-}\r
-\r
-\r
-/*\r
- * XImage, flat, NON-depth-buffered, PF_5R6G5B triangle.\r
- */\r
-static void flat_5R6G5B_triangle( GLcontext *ctx, GLuint v0, GLuint v1,\r
-                                  GLuint v2, GLuint pv )\r
-{\r
-   WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;\r
-#define PIXEL_ADDRESS(X,Y) PIXELADDR2(X,Y)\r
-#define PIXEL_TYPE GLushort\r
-//#define BYTES_PER_ROW (wmesa->xm_buffer->backimage->bytes_per_line)\r
-#define BYTES_PER_ROW (wmesa->ScanWidth)\r
-#define SETUP_CODE                                     \\r
-   unsigned long p = PACK_5R6G5B( VB->Color[pv][0],    \\r
-                VB->Color[pv][1], VB->Color[pv][2] );\r
-#define INNER_LOOP( LEFT, RIGHT, Y )                   \\r
-{                                                      \\r
-   GLint xx;                                           \\r
-   PIXEL_TYPE *pixel = pRow;                           \\r
-   for (xx=LEFT;xx<RIGHT;xx++,pixel++) {               \\r
-      *pixel = p;                                      \\r
-   }                                                   \\r
-}\r
-#include "tritemp.h"\r
-}\r
-\r
-\r
-/*\r
- * XImage, smooth, depth-buffered, 8-bit PF_LOOKUP triangle.\r
- */\r
-\r
-static void smooth_ci_z_triangle( GLcontext *ctx, GLuint v0, GLuint v1,\r
-                                       GLuint v2, GLuint pv )\r
-{\r
-   WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;\r
-#define INTERP_Z 1\r
-#define INTERP_INDEX 1\r
-#define PIXEL_ADDRESS(X,Y) PIXELADDR1(X,Y)\r
-#define PIXEL_TYPE GLubyte\r
-#define BYTES_PER_ROW (wmesa->ScanWidth)\r
-#define INNER_LOOP( LEFT, RIGHT, Y )                                                           \\r
-{                                                                                                                                      \\r
-   GLint i, len = RIGHT-LEFT;                                                                          \\r
-   for (i=0;i<len;i++) {                                                                                       \\r
-      GLdepth z = FixedToDepth(ffz);                                                           \\r
-      if (z < zRow[i]) {                                                                                       \\r
-         pRow[i] = FixedToInt(ffi);                                                                    \\r
-         zRow[i] = z;                                                                                          \\r
-      }                                                                                                                                \\r
-      ffi += fdidx;                                                                                                    \\r
-      ffz += fdzdx;                                                                                                    \\r
-   }                                                                                                                           \\r
-}\r
-\r
-#include "tritemp.h"\r
-}\r
-\r
-\r
-/*\r
- * XImage, flat, depth-buffered, 8-bit PF_LOOKUP triangle.\r
- */\r
-\r
-static void flat_ci_z_triangle( GLcontext *ctx, GLuint v0, GLuint v1,\r
-                                    GLuint v2, GLuint pv )\r
-{\r
-   WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;\r
-#define INTERP_Z 1\r
-#define PIXEL_ADDRESS(X,Y) PIXELADDR1(X,Y)\r
-#define PIXEL_TYPE GLubyte\r
-#define BYTES_PER_ROW (wmesa->ScanWidth)\r
-#define SETUP_CODE                                                                                                     \\r
-   GLuint index = VB->Index[pv];                                                                       \\r
-   if (!VB->MonoColor) {                                                                                       \\r
-      /* set the color index */                                                                                \\r
-      (*ctx->Driver.Index)( ctx, index );                                                      \\r
-   }\r
-#define INNER_LOOP( LEFT, RIGHT, Y )                                                           \\r
-{                                                                                                                                      \\r
-   GLint i, len = RIGHT-LEFT;                                                                          \\r
-   for (i=0;i<len;i++) {                                                                                       \\r
-      GLdepth z = FixedToDepth(ffz);                                                           \\r
-      if (z < zRow[i]) {                                                                                       \\r
-                pRow[i] = index;                                                                                       \\r
-         zRow[i] = z;                                                                                          \\r
-      }                                                                                                                                \\r
-      ffz += fdzdx;                                                                                                    \\r
-   }                                                                                                                           \\r
-}\r
-#include "tritemp.h"\r
-}\r
-\r
-\r
-\r
-/*\r
- * XImage, smooth, NON-depth-buffered, 8-bit PF_LOOKUP triangle.\r
- */\r
-\r
-static void smooth_ci_triangle( GLcontext *ctx, GLuint v0, GLuint v1,\r
-                                     GLuint v2, GLuint pv )\r
-{\r
-   WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;\r
-#define INTERP_Z 1\r
-#define INTERP_INDEX 1\r
-#define PIXEL_ADDRESS(X,Y) PIXELADDR1(X,Y)\r
-#define PIXEL_TYPE GLubyte\r
-#define BYTES_PER_ROW (wmesa->ScanWidth)\r
-#define INNER_LOOP( LEFT, RIGHT, Y )                                   \\r
-{                                                                      \\r
-   GLint xx;                                                           \\r
-   PIXEL_TYPE *pixel = pRow;                                           \\r
-   for (xx=LEFT;xx<RIGHT;xx++,pixel++) {                               \\r
-      *pixel = FixedToInt(ffi);                        \\r
-      ffi += fdidx;                    \\r
-   }                                                                   \\r
-}\r
-#include "tritemp.h"\r
-}\r
-\r
-\r
-/*\r
- * XImage, flat, NON-depth-buffered, 8-bit PF_LOOKUP triangle.\r
- */\r
-static void flat_ci_triangle( GLcontext *ctx, GLuint v0, GLuint v1,\r
-                                    GLuint v2, GLuint pv )\r
-{\r
-   WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;\r
-#define INTERP_Z 1\r
-#define PIXEL_ADDRESS(X,Y) PIXELADDR1(X,Y)\r
-#define PIXEL_TYPE GLubyte\r
-#define BYTES_PER_ROW (wmesa->ScanWidth)\r
-#define SETUP_CODE                                                                                                     \\r
-   GLuint index = VB->Index[pv];                                                                       \\r
-   if (!VB->MonoColor) {                                                                                       \\r
-      /* set the color index */                                                                                \\r
-      (*ctx->Driver.Index)( ctx, index );                                                      \\r
-   }\r
-#define INNER_LOOP( LEFT, RIGHT, Y )                   \\r
-{                                                      \\r
-   GLint xx;                                           \\r
-   PIXEL_TYPE *pixel = pRow;                           \\r
-   for (xx=LEFT;xx<RIGHT;xx++,pixel++) {               \\r
-      *pixel = index;                                  \\r
-   }                                                   \\r
-}\r
-#include "tritemp.h"\r
-}\r
-\r
-/*\r
- * XImage, smooth, depth-buffered, 8-bit, PF_DITHER8 triangle.\r
- */\r
-static void smooth_DITHER8_z_triangle( GLcontext *ctx,\r
-                                       GLuint v0, GLuint v1, GLuint v2,\r
-                                       GLuint pv )\r
-{\r
-   WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;\r
-   DITHER_RGB_TO_8BIT_SETUP\r
-#define INTERP_Z 1\r
-#define INTERP_RGB 1\r
-#define PIXEL_ADDRESS(X,Y) PIXELADDR1(X,Y)\r
-#define PIXEL_TYPE GLubyte\r
-#define BYTES_PER_ROW (wmesa->ScanWidth)\r
-#define INNER_LOOP( LEFT, RIGHT, Y )                                                                   \\r
-{                                                                                                                                              \\r
-   GLint i, xx = LEFT, yy = FLIP(Y), len = RIGHT-LEFT;                                 \\r
-   for (i=0;i<len;i++,xx++) {                                                                                  \\r
-      GLdepth z = FixedToDepth(ffz);                                                                   \\r
-      if (z < zRow[i]) {                                                                                               \\r
-                DITHER_RGB_TO_8BIT( FixedToInt(ffr), FixedToInt(ffg),                  \\r
-                                                               FixedToInt(ffb), xx, yy);                               \\r
-                pRow[i] = pixelDithered;                                                                               \\r
-         zRow[i] = z;                                                                                                  \\r
-      }                                                                                                                                        \\r
-      ffr += fdrdx;  ffg += fdgdx;  ffb += fdbdx;                                              \\r
-      ffz += fdzdx;                                                                                                            \\r
-   }                                                                                                                                   \\r
-}\r
-#include "tritemp.h"\r
-}\r
-\r
-/*\r
- * XImage, flat, depth-buffered, 8-bit PF_DITHER triangle.\r
- */\r
-static void flat_DITHER8_z_triangle( GLcontext *ctx, GLuint v0, GLuint v1,\r
-                                     GLuint v2, GLuint pv )\r
-{\r
-   WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;\r
-   DITHER_RGB_TO_8BIT_SETUP\r
-#define INTERP_Z 1\r
-#define PIXEL_ADDRESS(X,Y) PIXELADDR1(X,Y)\r
-#define PIXEL_TYPE GLubyte\r
-#define BYTES_PER_ROW (wmesa->ScanWidth)\r
-\r
-#define INNER_LOOP( LEFT, RIGHT, Y )                                                                   \\r
-{                                                                                                                                              \\r
-   GLint i, xx = LEFT, yy = FLIP(Y), len = RIGHT-LEFT;                                 \\r
-   for (i=0;i<len;i++,xx++) {                                                                                  \\r
-      GLdepth z = FixedToDepth(ffz);                                                                   \\r
-      if (z < zRow[i]) {                                                                                               \\r
-               DITHER_RGB_TO_8BIT( VB->Color[pv][0],                                                   \\r
-                        VB->Color[pv][1], VB->Color[pv][2], xx, yy);                           \\r
-               pRow[i] = pixelDithered;                                                                                \\r
-         zRow[i] = z;                                                                                                  \\r
-      }                                                                                                                                        \\r
-      ffz += fdzdx;                                                                                                            \\r
-   }                                                                                                                                   \\r
-}\r
-#include "tritemp.h"\r
-}\r
-\r
-/*\r
- * XImage, smooth, NON-depth-buffered, 8-bit PF_DITHER triangle.\r
- */\r
-static void smooth_DITHER8_triangle( GLcontext *ctx, GLuint v0, GLuint v1,\r
-                                    GLuint v2, GLuint pv )\r
-{\r
-   WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;\r
-   DITHER_RGB_TO_8BIT_SETUP\r
-#define INTERP_RGB 1\r
-#define PIXEL_ADDRESS(X,Y) PIXELADDR1(X,Y)\r
-#define PIXEL_TYPE GLubyte\r
-#define BYTES_PER_ROW (wmesa->ScanWidth)\r
-#define INNER_LOOP( LEFT, RIGHT, Y )                                                                   \\r
-{                                                                                                                                              \\r
-   GLint xx, yy = FLIP(Y);                                                                                             \\r
-   PIXEL_TYPE *pixel = pRow;                                                                                   \\r
-   for (xx=LEFT;xx<RIGHT;xx++,pixel++) {                                                               \\r
-         DITHER_RGB_TO_8BIT( VB->Color[pv][0], VB->Color[pv][1], VB->Color[pv][2], xx, yy);\\r
-         *pixel = pixelDithered;                                                                                       \\r
-         ffr += fdrdx;  ffg += fdgdx;  ffb += fdbdx;                                           \\r
-   }                                                                                                                                   \\r
-}\r
-#include "tritemp.h"\r
-}\r
-\r
-/*\r
- * XImage, flat, NON-depth-buffered, 8-bit PF_DITHER triangle.\r
- */\r
-\r
-static void flat_DITHER8_triangle( GLcontext *ctx, GLuint v0, GLuint v1,\r
-                                   GLuint v2, GLuint pv )\r
-{\r
-   WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;\r
-   DITHER_RGB_TO_8BIT_SETUP\r
-#define PIXEL_ADDRESS(X,Y) PIXELADDR1(X,Y)\r
-#define PIXEL_TYPE GLubyte\r
-#define BYTES_PER_ROW (wmesa->ScanWidth)\r
-\r
-#define INNER_LOOP( LEFT, RIGHT, Y )                                                                   \\r
-{                                                                                                                                              \\r
-   GLint xx, yy = FLIP(Y);                                                                                             \\r
-   PIXEL_TYPE *pixel = pRow;                                                                                   \\r
-   for (xx=LEFT;xx<RIGHT;xx++,pixel++) {                                                               \\r
-      DITHER_RGB_TO_8BIT( VB->Color[pv][0],                                                            \\r
-                        VB->Color[pv][1], VB->Color[pv][2], xx, yy);                           \\r
-         *pixel = pixelDithered;                                                                                       \\r
-   }                                                                                                                                   \\r
-}\r
-#include "tritemp.h"\r
-}\r
-\r
-\r
-\r
-\r
-static triangle_func choose_triangle_function( GLcontext *ctx )\r
-{\r
-   WMesaContext wmesa = (WMesaContext) ctx->DriverCtx;\r
-   int depth = wmesa->cColorBits;\r
-\r
-   if (ctx->Polygon.SmoothFlag)     return NULL;\r
-   if (ctx->Texture.Enabled)        return NULL;\r
-   if (!wmesa->db_flag) return NULL;\r
-   /*if (wmesa->xm_buffer->buffer==XIMAGE)*/ {\r
-      if (   ctx->Light.ShadeModel==GL_SMOOTH\r
-          && ctx->_RasterMask==DEPTH_BIT\r
-          && ctx->Depth.Func==GL_LESS\r
-          && ctx->Depth.Mask==GL_TRUE\r
-          && ctx->Polygon.StippleFlag==GL_FALSE) {\r
-         switch (wmesa->pixelformat) {\r
-            case PF_8A8B8G8R:\r
-               return smooth_8A8B8G8R_z_triangle;\r
-            case PF_8R8G8B:\r
-               return smooth_8R8G8B_z_triangle;\r
-            case PF_5R6G5B:\r
-               return smooth_5R6G5B_z_triangle;\r
-            case PF_DITHER8:\r
-               return  smooth_DITHER8_z_triangle;\r
-            case PF_INDEX8:\r
-               return smooth_ci_z_triangle;\r
-            default:\r
-               return NULL;\r
-         }\r
-      }\r
-      if (   ctx->Light.ShadeModel==GL_FLAT\r
-          && ctx->_RasterMask==DEPTH_BIT\r
-          && ctx->Depth.Func==GL_LESS\r
-          && ctx->Depth.Mask==GL_TRUE\r
-          && ctx->Polygon.StippleFlag==GL_FALSE) {\r
-         switch (wmesa->pixelformat) {\r
-            case PF_8A8B8G8R:\r
-               return flat_8A8B8G8R_z_triangle;\r
-            case PF_8R8G8B:\r
-               return flat_8R8G8B_z_triangle;\r
-            case PF_5R6G5B:\r
-               return flat_5R6G5B_z_triangle;\r
-            case PF_DITHER8:\r
-               return flat_DITHER8_z_triangle;\r
-            case PF_INDEX8:\r
-               return flat_ci_z_triangle;\r
-                       default:\r
-               return NULL;\r
-         }\r
-      }\r
-      if (   ctx->_RasterMask==0   /* no depth test */\r
-          && ctx->Light.ShadeModel==GL_SMOOTH\r
-          && ctx->Polygon.StippleFlag==GL_FALSE) {\r
-         switch (wmesa->pixelformat) {\r
-            case PF_8A8B8G8R:\r
-               return smooth_8A8B8G8R_triangle;\r
-            case PF_8R8G8B:\r
-               return smooth_8R8G8B_triangle;\r
-            case PF_5R6G5B:\r
-               return smooth_5R6G5B_triangle;\r
-            case PF_DITHER8:\r
-               return smooth_DITHER8_triangle;\r
-                       case PF_INDEX8:\r
-               return smooth_ci_triangle;\r
-            default:\r
-               return NULL;\r
-         }\r
-      }\r
-\r
-      if (   ctx->_RasterMask==0   /* no depth test */\r
-          && ctx->Light.ShadeModel==GL_FLAT\r
-          && ctx->Polygon.StippleFlag==GL_FALSE) {\r
-         switch (wmesa->pixelformat) {\r
-            case PF_8A8B8G8R:\r
-               return flat_8A8B8G8R_triangle;\r
-            case PF_8R8G8B:\r
-               return flat_8R8G8B_triangle;\r
-            case PF_5R6G5B:\r
-               return flat_5R6G5B_triangle;\r
-            case PF_DITHER8:\r
-               return flat_DITHER8_triangle;\r
-                       case PF_INDEX8:\r
-               return flat_ci_triangle;\r
-            default:\r
-               return NULL;\r
-         }\r
-      }\r
-\r
-      return NULL;\r
-   }\r
-}\r
-\r
-/*\r
- * Define a new viewport and reallocate auxillary buffers if the size of\r
- * the window (color buffer) has changed.\r
- */\r
-void WMesaViewport( GLcontext *ctx,\r
-                  GLint x, GLint y, GLsizei width, GLsizei height )\r
-{\r
-   /* Save viewport */\r
-   ctx->Viewport.X = x;\r
-   ctx->Viewport.Width = width;\r
-   ctx->Viewport.Y = y;\r
-   ctx->Viewport.Height = height;\r
-\r
-   /* compute scale and bias values */\r
-   ctx->Viewport.Sx = (GLfloat) width / 2.0F;\r
-   ctx->Viewport.Tx = ctx->Viewport.Sx + x;\r
-   ctx->Viewport.Sy = (GLfloat) height / 2.0F;\r
-   ctx->Viewport.Ty = ctx->Viewport.Sy + y;\r
-}\r
diff --git a/src/mesa/drivers/windows/wmesa_stereo.c b/src/mesa/drivers/windows/wmesa_stereo.c
deleted file mode 100644 (file)
index adae152..0000000
+++ /dev/null
@@ -1,1835 +0,0 @@
-/*\r
-       WMesa_stereo.c\r
-*/\r
-// Stereo display feature added by Li Wei\r
-// Updated 1996/10/06  11:16:15 CST\r
-// Paralell render feature added by Li Wei\r
-// liwei@aiar.xjtu.edu.cn\r
-// http://sun.aiar.xjtu.edu.cn\r
-\r
-#define WMESA_STEREO_C\r
-\r
-#include <windows.h>\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include <wmesadef.h>\r
-\r
-#include <GL\wmesa.h>\r
-#include "context.h"\r
-#include "dd.h"\r
-#include "imports.h"\r
-#include "xform.h"\r
-#include "vb.h"\r
-#include "matrix.h"\r
-#include "depth.h"\r
-\r
-#ifdef PROFILE\r
-       #include "profile.h"\r
-#endif\r
-\r
-#include <wing.h>\r
-\r
-// Code added by Li Wei to enable stereo display  and Paralell render\r
-\r
-\r
-/*#include "mesa_extend.h"*/\r
-\r
-#if !defined(NO_STEREO)\r
-\r
-       #include "gl\glu.h"\r
-       #include "stereo.h"\r
-\r
-       PBYTE Buffer_Stereo;\r
-\r
-       void WMesaCreateStereoBuffer(void);\r
-\r
-       void WMesaInterleave( GLenum aView);\r
-\r
-       void WMesaDestroyStereoBuffer(void);\r
-\r
-       void WMesaShowStereo(GLuint list);\r
-#endif\r
-#if !defined(NO_PARALLEL)\r
-       #include "parallel.h"\r
-#endif\r
-\r
-/* end of added code*/\r
-\r
-/* Bit's used for dest: */\r
-#define FRONT_PIXMAP   1\r
-#define BACK_PIXMAP    2\r
-#define BACK_XIMAGE    4\r
-\r
-static PWMC Current = NULL;\r
-WMesaContext WC = NULL;\r
-\r
-#ifdef NDEBUG\r
-  #define assert(ignore)       ((void) 0)\r
-#else\r
-  void Mesa_Assert(void *Cond,void *File,unsigned Line)\r
-  {\r
-    char Msg[512];\r
-    sprintf(Msg,"%s %s %d",Cond,File,Line);\r
-    MessageBox(NULL,Msg,"Assertion failed.",MB_OK);\r
-    exit(1);\r
-  }\r
-  #define assert(e)    if (!e) Mesa_Assert(#e,__FILE__,__LINE__);\r
-#endif\r
-\r
-#define DD_GETDC ((Current->db_flag) ? Current->dib.hDC : Current->hDC )\r
-#define DD_RELEASEDC\r
-\r
-//#define BEGINGDICALL if(Current->rgb_flag)wmFlushBits(Current);\r
-#define BEGINGDICALL\r
-//#define ENDGDICALL           if(Current->rgb_flag)wmGetBits(Current);\r
-#define ENDGDICALL\r
-\r
-#define FLIP(Y)  (Current->height-(Y)-1)\r
-\r
-#define STARTPROFILE\r
-#define ENDPROFILE(PARA)\r
-\r
-static void FlushToFile(PWMC pwc, PSTR szFile);\r
-\r
-BOOL wmCreateBackingStore(PWMC pwc, long lxSize, long lySize);\r
-\r
-BOOL wmDeleteBackingStore(PWMC pwc);\r
-\r
-void wmCreatePalette( PWMC pwdc );\r
-BOOL wmSetDibColors(PWMC pwc);\r
-void wmSetPixel(PWMC pwc, int iScanLine, int iPixel, BYTE r, BYTE g, BYTE b);\r
-\r
-void wmCreateDIBSection(\r
-       HDC      hDC,\r
-    PWMC pwc,  // handle of device context\r
-    CONST BITMAPINFO *pbmi,    // address of structure containing bitmap size, format, and color data\r
-    UINT iUsage        // color data type indicator: RGB values or palette indices\r
-    );\r
-\r
-BOOL wmFlush(PWMC pwc);\r
-\r
-/*\r
- * Useful macros:\r
-   Modified from file osmesa.c\r
- */\r
-\r
-#define PIXELADDR(X,Y)  ((GLbyte *)Current->pbPixels + (Current->height-Y)* Current->ScanWidth + (X)*nBypp)\r
-\r
-\r
-/* Finish all pending operations and synchronize. */\r
-static void finish(GLcontext* ctx)\r
-{\r
-   /* no op */\r
-}\r
-\r
-\r
-//\r
-// We cache all gl draw routines until a flush is made\r
-//\r
-static void flush(GLcontext* ctx)\r
-{\r
-       STARTPROFILE\r
-       if(Current->rgb_flag && !(Current->dib.fFlushed)&&!(Current->db_flag)){\r
-               wmFlush(Current);\r
-       }\r
-       ENDPROFILE(flush)\r
-\r
-}\r
-\r
-\r
-\r
-/*\r
- * Set the color index used to clear the color buffer.\r
- */\r
-static void clear_index(GLcontext* ctx, GLuint index)\r
-{\r
-  STARTPROFILE\r
-  Current->clearpixel = index;\r
-  ENDPROFILE(clear_index)\r
-}\r
-\r
-\r
-\r
-/*\r
- * Set the color used to clear the color buffer.\r
- */\r
-static void clear_color( GLcontext* ctx, const GLfloat color[4] )\r
-{\r
-  STARTPROFILE\r
-  GLubyte col[4];\r
-  CLAMPED_FLOAT_TO_UBYTE(col[0], color[0]);\r
-  CLAMPED_FLOAT_TO_UBYTE(col[1], color[1]);\r
-  CLAMPED_FLOAT_TO_UBYTE(col[2], color[2]);\r
-  Current->clearpixel = RGB(col[0], col[1], col[2]);\r
-  ENDPROFILE(clear_color)\r
-}\r
-\r
-\r
-\r
-/*\r
- * Clear the specified region of the color buffer using the clear color\r
- * or index as specified by one of the two functions above.\r
- */\r
-static void clear(GLcontext* ctx,\r
-                                 GLboolean all,GLint x, GLint y, GLint width, GLint height )\r
-{\r
-       DWORD   dwColor;\r
-       WORD    wColor;\r
-       LPDWORD lpdw = (LPDWORD)Current->pbPixels;\r
-       LPWORD  lpw = (LPWORD)Current->pbPixels;\r
-       LPBYTE  lpb = Current->pbPixels;\r
-\r
-    STARTPROFILE\r
-\r
-       if (all){\r
-               x=y=0;\r
-               width=Current->width;\r
-               height=Current->height;\r
-       }\r
-       if (Current->rgb_flag==GL_TRUE){\r
-               if(Current->db_flag==GL_TRUE){\r
-                       UINT    nBypp = Current->cColorBits / 8;\r
-                       int             i = 0;\r
-                       int             iSize;\r
-\r
-                       if(nBypp == 2){\r
-                               iSize = (Current->width * Current->height) / nBypp;\r
-\r
-                               wColor = BGR16(GetRValue(Current->clearpixel),\r
-                                                          GetGValue(Current->clearpixel),\r
-                                                          GetBValue(Current->clearpixel));\r
-                               dwColor = MAKELONG(wColor, wColor);\r
-                       }\r
-                       else if(nBypp == 4){\r
-                               iSize = (Current->width * Current->height);\r
-\r
-                               dwColor = BGR32(GetRValue(Current->clearpixel),\r
-                                                          GetGValue(Current->clearpixel),\r
-                                                          GetBValue(Current->clearpixel));\r
-                       }\r
-                       //\r
-                       // This is the 24bit case\r
-                       //\r
-                       else {\r
-\r
-                               iSize = (Current->width * Current->height) / nBypp;\r
-\r
-                               dwColor = BGR24(GetRValue(Current->clearpixel),\r
-                                                          GetGValue(Current->clearpixel),\r
-                                                          GetBValue(Current->clearpixel));\r
-\r
-\r
-                               while(i < iSize){\r
-                                       *lpdw = dwColor;\r
-                                       lpb += nBypp;\r
-                                       lpdw = (LPDWORD)lpb;\r
-                                       i++;\r
-                               }\r
-\r
-       //                      ENDPROFILE(clear)\r
-\r
-                               return;\r
-                       }\r
-\r
-                       while(i < iSize){\r
-                               *lpdw = dwColor;\r
-                               lpdw++;\r
-                               i++;\r
-                       }\r
-               }\r
-               else{ // For single buffer\r
-                HDC DC=DD_GETDC;\r
-                HPEN Pen=CreatePen(PS_SOLID,1,Current->clearpixel);\r
-                HBRUSH Brush=CreateSolidBrush(Current->clearpixel);\r
-                HPEN Old_Pen=SelectObject(DC,Pen);\r
-                HBRUSH Old_Brush=SelectObject(DC,Brush);\r
-                Rectangle(DC,x,y,x+width,y+height);\r
-                SelectObject(DC,Old_Pen);\r
-                SelectObject(DC,Old_Brush);\r
-                DeleteObject(Pen);\r
-                DeleteObject(Brush);\r
-                DD_RELEASEDC;\r
-               }\r
-       }\r
-       else {\r
-               int i;\r
-               char *Mem=Current->ScreenMem+y*Current->ScanWidth+x;\r
-               for (i=0; i<height; i++){\r
-                       memset(Mem,Current->clearpixel,width);\r
-                       Mem+=width;\r
-               }\r
-       }\r
-       ENDPROFILE(clear)\r
-}\r
-\r
-\r
-\r
-/* Set the current color index. */\r
-static void set_index(GLcontext* ctx, GLuint index)\r
-{\r
-  STARTPROFILE\r
-  Current->pixel=index;\r
-  ENDPROFILE(set_index)\r
-}\r
-\r
-\r
-\r
-/* Set the current RGBA color. */\r
-static void set_color( GLcontext* ctx, GLubyte r, GLubyte g, GLubyte b, GLubyte a )\r
-{\r
-  STARTPROFILE\r
-  Current->pixel = RGB( r, g, b );\r
-  ENDPROFILE(set_color)\r
-}\r
-\r
-\r
-\r
-\r
-static GLboolean set_buffer( GLcontext* ctx, GLenum mode )\r
-{\r
-   STARTPROFILE\r
-   /* TODO: this could be better */\r
-   if (mode==GL_FRONT || mode==GL_BACK) {\r
-      return GL_TRUE;\r
-   }\r
-   else {\r
-      return GL_FALSE;\r
-   }\r
-   ENDPROFILE(set_buffer)\r
-}\r
-\r
-\r
-\r
-/* Return characteristics of the output buffer. */\r
-static void buffer_size( GLcontext* ctx, GLuint *width, GLuint *height /*, GLuint *depth */)\r
-{\r
-\r
-       int New_Size;\r
-       RECT CR;\r
-\r
-       STARTPROFILE\r
-       GetClientRect(Current->Window,&CR);\r
-\r
-       *width=CR.right;\r
-       *height=CR.bottom;\r
-//     *depth = Current->depth;\r
-\r
-       New_Size=((*width)!=Current->width) || ((*height)!=Current->height);\r
-\r
-       if (New_Size){\r
-               Current->width=*width;\r
-               Current->height=*height;\r
-               Current->ScanWidth=Current->width;\r
-           if ((Current->ScanWidth%sizeof(long))!=0)\r
-                       Current->ScanWidth+=(sizeof(long)-(Current->ScanWidth%sizeof(long)));\r
-\r
-               if (Current->db_flag){\r
-                       if (Current->rgb_flag==GL_TRUE){\r
-                               wmDeleteBackingStore(Current);\r
-                               wmCreateBackingStore(Current, Current->width, Current->height);\r
-                       }\r
-                       else{\r
-                               Current->ScanWidth=Current->width;\r
-                           if ((Current->ScanWidth%sizeof(long))!=0)\r
-                               Current->ScanWidth+=(sizeof(long)-(Current->ScanWidth%sizeof(long)));\r
-\r
-                               Current->IndexFormat->bmiHeader.biWidth=Current->width;\r
-\r
-                               if (Current->IndexFormat->bmiHeader.biHeight<0)\r
-                                       Current->IndexFormat->bmiHeader.biHeight=-(Current->height);\r
-                               else\r
-                                       Current->IndexFormat->bmiHeader.biHeight=Current->height;\r
-\r
-                               Current->Compat_BM=WinGCreateBitmap(Current->dib.hDC,Current->IndexFormat,&((void *) Current->ScreenMem));\r
-\r
-                               DeleteObject(SelectObject(Current->dib.hDC,Current->Compat_BM));\r
-                       }\r
-//Code added by Li Wei to enable stereo display\r
-// Recreate stereo buffer when stereo_flag is TRUE while parallelFlag is FALSE\r
-#if !defined(NO_STEREO)\r
-                       if(stereo_flag\r
-#if !defined(NO_PARALLEL)\r
-                               &&!parallelFlag\r
-#endif\r
-                               ) {\r
-                       if(stereoBuffer == GL_TRUE)\r
-                               WMesaDestroyStereoBuffer();\r
-                       WMesaCreateStereoBuffer();\r
-                       }\r
-#endif\r
-//     Resize OsmesaBuffer if in Parallel mode\r
-#if !defined(NO_PARALLEL)\r
-                       if(parallelFlag)\r
-                       PRSizeRenderBuffer(Current->width, Current->height,Current->ScanWidth,\r
-                       Current->rgb_flag == GL_TRUE ? Current->pbPixels: Current->ScreenMem);\r
-#endif\r
-//end modification\r
-\r
-               }\r
-       }\r
-\r
-   ENDPROFILE(buffer_size)\r
-}\r
-\r
-\r
-\r
-/**********************************************************************/\r
-/*****           Accelerated point, line, polygon rendering       *****/\r
-/**********************************************************************/\r
-\r
-\r
-static void fast_rgb_points( GLcontext* ctx, GLuint first, GLuint last )\r
-{\r
-   GLuint i;\r
- //  HDC DC=DD_GETDC;\r
-       PWMC    pwc = Current;\r
-\r
-       STARTPROFILE\r
-\r
-       if (Current->gl_ctx->VB->MonoColor) {\r
-      /* all drawn with current color */\r
-      for (i=first;i<=last;i++) {\r
-         if (Current->gl_ctx->VB->ClipMask[i]==0) {\r
-            int x, y;\r
-            x =       (GLint) Current->gl_ctx->VB->Win[i][0];\r
-            y = FLIP( (GLint) Current->gl_ctx->VB->Win[i][1] );\r
-                       wmSetPixel(pwc, y,x,GetRValue(Current->pixel),\r
-                                           GetGValue(Current->pixel), GetBValue(Current->pixel));\r
-         }\r
-      }\r
-   }\r
-   else {\r
-      /* draw points of different colors */\r
-      for (i=first;i<=last;i++) {\r
-         if (Current->gl_ctx->VB->ClipMask[i]==0) {\r
-            int x, y;\r
-            unsigned long pixel=RGB(Current->gl_ctx->VB->Color[i][0]*255.0,\r
-                                    Current->gl_ctx->VB->Color[i][1]*255.0,\r
-                                    Current->gl_ctx->VB->Color[i][2]*255.0);\r
-            x =       (GLint) Current->gl_ctx->VB->Win[i][0];\r
-            y = FLIP( (GLint) Current->gl_ctx->VB->Win[i][1] );\r
-                       wmSetPixel(pwc, y,x,Current->gl_ctx->VB->Color[i][0]*255.0,\r
-                                    Current->gl_ctx->VB->Color[i][1]*255.0,\r
-                                    Current->gl_ctx->VB->Color[i][2]*255.0);\r
-         }\r
-      }\r
-   }\r
-//   DD_RELEASEDC;\r
-   ENDPROFILE(fast_rgb_points)\r
-}\r
-\r
-\r
-\r
-/* Return pointer to accerated points function */\r
-extern points_func choose_points_function( GLcontext* ctx )\r
-{\r
-   STARTPROFILE\r
-   if (ctx->Point.Size==1.0 && !ctx->Point.SmoothFlag && ctx->_RasterMask==0\r
-       && ctx->Texture._EnabledUnits == 0 && ctx->Visual->RGBAflag) {\r
-   ENDPROFILE(choose_points_function)\r
-      return fast_rgb_points;\r
-   }\r
-   else {\r
-   ENDPROFILE(choose_points_function)\r
-      return NULL;\r
-   }\r
-}\r
-\r
-\r
-\r
-/* Draw a line using the color specified by Current->gl_ctx->VB->Color[pv] */\r
-static void fast_flat_rgb_line( GLcontext* ctx, GLuint v0, GLuint v1, GLuint pv )\r
-{\r
-       STARTPROFILE\r
-       int x0, y0, x1, y1;\r
-       unsigned long pixel;\r
-       HDC DC=DD_GETDC;\r
-       HPEN Pen;\r
-       HPEN Old_Pen;\r
-\r
-       if (Current->gl_ctx->VB->MonoColor) {\r
-         pixel = Current->pixel;  /* use current color */\r
-       }\r
-       else {\r
-         pixel = RGB(Current->gl_ctx->VB->Color[pv][0]*255.0, Current->gl_ctx->VB->Color[pv][1]*255.0, Current->gl_ctx->VB->Color[pv][2]*255.0);\r
-       }\r
-\r
-       x0 =       (int) Current->gl_ctx->VB->Win[v0][0];\r
-       y0 = FLIP( (int) Current->gl_ctx->VB->Win[v0][1] );\r
-       x1 =       (int) Current->gl_ctx->VB->Win[v1][0];\r
-       y1 = FLIP( (int) Current->gl_ctx->VB->Win[v1][1] );\r
-\r
-\r
-       BEGINGDICALL\r
-\r
-       Pen=CreatePen(PS_SOLID,1,pixel);\r
-       Old_Pen=SelectObject(DC,Pen);\r
-       MoveToEx(DC,x0,y0,NULL);\r
-       LineTo(DC,x1,y1);\r
-       SelectObject(DC,Old_Pen);\r
-       DeleteObject(Pen);\r
-       DD_RELEASEDC;\r
-\r
-       ENDGDICALL\r
-\r
-       ENDPROFILE(fast_flat_rgb_line)\r
-}\r
-\r
-\r
-\r
-/* Return pointer to accerated line function */\r
-static line_func choose_line_function( GLcontext* ctx )\r
-{\r
-       STARTPROFILE\r
-   if (ctx->Line.Width==1.0 && !ctx->Line.SmoothFlag && !ctx->Line.StippleFlag\r
-       && ctx->Light.ShadeModel==GL_FLAT && ctx->_RasterMask==0\r
-       && ctx->Texture._EnabledUnits == 0 && Current->rgb_flag) {\r
-   ENDPROFILE(choose_line_function)\r
-      return fast_flat_rgb_line;\r
-   }\r
-   else {\r
-   ENDPROFILE(choose_line_function)\r
-      return NULL;\r
-   }\r
-}\r
-\r
-/**********************************************************************/\r
-/*****                 Optimized triangle rendering               *****/\r
-/**********************************************************************/\r
-\r
-\r
-/*\r
- * Smooth-shaded, z-less triangle, RGBA color.\r
- */\r
-static void smooth_color_z_triangle( GLcontext *ctx, GLuint v0, GLuint v1,\r
-                                     GLuint v2, GLuint pv )\r
-{\r
-UINT   nBypp = Current->cColorBits / 8;\r
-GLbyte* img;\r
-GLushort* img16;\r
-GLuint *img24 ,*img32;\r
-#define INTERP_Z 1\r
-#define INTERP_RGB 1\r
-#define INTERP_ALPHA 1\r
-#define INNER_LOOP( LEFT, RIGHT, Y )                                                   \\r
-{                                                                                                                              \\r
-   GLint i, len = RIGHT-LEFT;                                                                  \\r
-   img = PIXELADDR(LEFT,Y);                                                                    \\r
-   for (i=0;i<len;i++,img+=nBypp) {                                                            \\r
-      GLdepth z = FixedToDepth(ffz);                                                   \\r
-      if (z < zRow[i]) {                                                                               \\r
-                img16 = img24 = img32 = img;                                                   \\r
-                if(nBypp == 2)                                                                                 \\r
-                       *img16 = BGR16( FixedToInt(ffr), FixedToInt(ffg),       \\r
-                                                       FixedToInt(ffb));                                       \\r
-                if(nBypp == 3)                                                                                 \\r
-                       *img24 = BGR24( FixedToInt(ffr), FixedToInt(ffg),       \\r
-                                                       FixedToInt(ffb));                                       \\r
-                if(nBypp == 4)                                                                                 \\r
-                       *img32 = BGR32( FixedToInt(ffr), FixedToInt(ffg),       \\r
-                                                       FixedToInt(ffb));                                       \\r
-         zRow[i] = z;                                                                                  \\r
-      }                                                                                                                        \\r
-      ffr += fdrdx;  ffg += fdgdx;  ffb += fdbdx;  ffa += fdadx;\\r
-      ffz += fdzdx;                                                                                            \\r
-   }                                                                                                                   \\r
-}\r
-\r
-       #include "tritemp.h"\r
- }\r
-\r
-\r
-\r
-\r
-/*\r
- * Flat-shaded, z-less triangle, RGBA color.\r
- */\r
-static void flat_color_z_triangle( GLcontext *ctx, GLuint v0, GLuint v1,\r
-                                   GLuint v2, GLuint pv )\r
-{\r
-GLbyte* img;\r
-GLushort* img16;\r
-GLuint *img24, *img32;\r
-UINT   nBypp = Current->cColorBits / 8;\r
-GLubyte r, g, b ;\r
-GLushort pixel16 = BGR16(r,g,b);\r
-GLuint   pixel24 = BGR24(r,g,b);\r
-GLuint   pixel32 = BGR32(r,g,b);\r
-\r
-#define INTERP_Z 1\r
-#define SETUP_CODE                     \\r
-   r = VB->Color[pv][0];       \\r
-   g = VB->Color[pv][1];       \\r
-   b = VB->Color[pv][2];\r
-\r
-#define INNER_LOOP( LEFT, RIGHT, Y )                                                   \\r
-{                                                                                                                              \\r
-   GLint i, len = RIGHT-LEFT;                                                                  \\r
-   img = PIXELADDR(LEFT,Y);                                                                            \\r
-   for (i=0;i<len;i++,img+=nBypp) {                                                            \\r
-      GLdepth z = FixedToDepth(ffz);                                                   \\r
-      if (z < zRow[i]) {                                                                               \\r
-         img16 = img24 = img32 = img;                                                  \\r
-                if(nBypp == 2)                                                                                 \\r
-                       *img16 = pixel16;                                                                       \\r
-                if(nBypp == 3)                                                                                 \\r
-                       *img24 = pixel24;                                                                       \\r
-                if(nBypp == 4)                                                                                 \\r
-                       *img32 = pixel32;                                                                       \\r
-         zRow[i] = z;                                                                                  \\r
-      }                                                                                                                        \\r
-      ffz += fdzdx;                                                                                            \\r
-   }                                                                                                                   \\r
-}\r
-\r
-#include "tritemp.h"\r
-}\r
-\r
-\r
-\r
-/*\r
- * Return pointer to an accelerated triangle function if possible.\r
- */\r
-static triangle_func choose_triangle_function( GLcontext *ctx )\r
-{\r
-   if (ctx->Polygon.SmoothFlag)     return NULL;\r
-   if (ctx->Polygon.StippleFlag)    return NULL;\r
-   if (ctx->Texture._EnabledUnits)  return NULL;\r
-\r
-   if (ctx->_RasterMask==DEPTH_BIT\r
-       && ctx->Depth.Func==GL_LESS\r
-       && ctx->Depth.Mask==GL_TRUE\r
-       && ctx->Visual->RGBAflag) {\r
-       if (ctx->Light.ShadeModel==GL_SMOOTH) {\r
-         return smooth_color_z_triangle;\r
-      }\r
-      else {\r
-         return flat_color_z_triangle;\r
-      }\r
-   }\r
-   return NULL;\r
-}\r
-\r
-\r
-/* Draw a convex polygon using color Current->gl_ctx->VB->Color[pv] */\r
-static void fast_flat_rgb_polygon( GLcontext* ctx, GLuint n, GLuint vlist[], GLuint pv )\r
-{\r
-   STARTPROFILE\r
-   POINT *Pts=(POINT *) malloc(n*sizeof(POINT));\r
-   HDC DC=DD_GETDC;\r
-   HPEN Pen;\r
-   HBRUSH Brush;\r
-   HPEN Old_Pen;\r
-   HBRUSH Old_Brush;\r
-   GLint pixel;\r
-   GLuint i;\r
-\r
-   if (Current->gl_ctx->VB->MonoColor) {\r
-      pixel = Current->pixel;  /* use current color */\r
-   }\r
-   else {\r
-      pixel = RGB(Current->gl_ctx->VB->Color[pv][0]*255.0, Current->gl_ctx->VB->Color[pv][1]*255.0, Current->gl_ctx->VB->Color[pv][2]*255.0);\r
-   }\r
-\r
-   Pen=CreatePen(PS_SOLID,1,pixel);\r
-   Brush=CreateSolidBrush(pixel);\r
-   Old_Pen=SelectObject(DC,Pen);\r
-   Old_Brush=SelectObject(DC,Brush);\r
-\r
-   for (i=0; i<n; i++) {\r
-      int j = vlist[i];\r
-      Pts[i].x =       (int) Current->gl_ctx->VB->Win[j][0];\r
-      Pts[i].y = FLIP( (int) Current->gl_ctx->VB->Win[j][1] );\r
-   }\r
-\r
-   BEGINGDICALL\r
-\r
-   Polygon(DC,Pts,n);\r
-   SelectObject(DC,Old_Pen);\r
-   SelectObject(DC,Old_Brush);\r
-   DeleteObject(Pen);\r
-   DeleteObject(Brush);\r
-   DD_RELEASEDC;\r
-   free(Pts);\r
-\r
-   ENDGDICALL\r
-\r
-  ENDPROFILE(fast_flat_rgb_polygon)\r
-}\r
-\r
-\r
-\r
-/* Return pointer to accerated polygon function */\r
-static polygon_func choose_polygon_function( GLcontext* ctx )\r
-{\r
-   STARTPROFILE\r
-   if (!ctx->Polygon.SmoothFlag && !ctx->Polygon.StippleFlag\r
-       && ctx->Light.ShadeModel==GL_FLAT && ctx->_RasterMask==0\r
-       && ctx->Texture._EnabledUnits == 0 && Current->rgb_flag==GL_TRUE) {\r
-      ENDPROFILE(choose_polygon_function)\r
-      return fast_flat_rgb_polygon;\r
-   }\r
-   else {\r
-      ENDPROFILE(choose_polygon_function)\r
-      return NULL;\r
-   }\r
-}\r
-\r
-\r
-\r
-/**********************************************************************/\r
-/*****                 Span-based pixel drawing                   *****/\r
-/**********************************************************************/\r
-\r
-\r
-/* Write a horizontal span of color-index pixels with a boolean mask. */\r
-static void write_index_span( GLcontext* ctx,\r
-                              GLuint n, GLint x, GLint y,\r
-                              const GLuint index[],\r
-                              const GLubyte mask[] )\r
-{\r
-   STARTPROFILE\r
-   GLuint i;\r
-   char *Mem=Current->ScreenMem+y*Current->ScanWidth+x;\r
-   assert(Current->rgb_flag==GL_FALSE);\r
-   for (i=0; i<n; i++)\r
-      if (mask[i])\r
-         Mem[i]=index[i];\r
-   ENDPROFILE(write_index_span)\r
-}\r
-\r
-\r
-\r
-/*\r
- * Write a horizontal span of pixels with a boolean mask.  The current\r
- * color index is used for all pixels.\r
- */\r
-static void write_monoindex_span(GLcontext* ctx,\r
-                                                                GLuint n,GLint x,GLint y,\r
-                                                                const GLubyte mask[])\r
-{\r
-         STARTPROFILE\r
-         GLuint i;\r
-         char *Mem=Current->ScreenMem+y*Current->ScanWidth+x;\r
-         assert(Current->rgb_flag==GL_FALSE);\r
-         for (i=0; i<n; i++)\r
-               if (mask[i])\r
-                 Mem[i]=Current->pixel;\r
-         ENDPROFILE(write_monoindex_span)\r
-}\r
-\r
-/*\r
-       To improve the performance of this routine, frob the data into an actual scanline\r
-       and call bitblt on the complete scan line instead of SetPixel.\r
-*/\r
-\r
-/* Write a horizontal span of color pixels with a boolean mask. */\r
-static void write_color_span( GLcontext* ctx,\r
-                         GLuint n, GLint x, GLint y,\r
-                         const GLubyte\r
-                         red[], const GLubyte green[],\r
-                         const GLubyte blue[], const GLubyte alpha[],\r
-                         const GLubyte mask[] )\r
-{\r
-       STARTPROFILE\r
-\r
-       PWMC    pwc = Current;\r
-\r
-       if (pwc->rgb_flag==GL_TRUE)\r
-       {\r
-               GLuint i;\r
-               HDC DC=DD_GETDC;\r
-               y=FLIP(y);\r
-\r
-               if (mask) {\r
-                       for (i=0; i<n; i++)\r
-                               if (mask[i])\r
-                                       wmSetPixel(pwc, y, x + i,red[i], green[i], blue[i]);\r
-               }\r
-\r
-               else {\r
-                       for (i=0; i<n; i++)\r
-                               wmSetPixel(pwc, y, x + i, red[i], green[i], blue[i]);\r
-               }\r
-\r
-               DD_RELEASEDC;\r
-\r
-       }\r
-\r
-  else\r
-  {\r
-               GLuint i;\r
-               char *Mem=Current->ScreenMem+y*Current->ScanWidth+x;\r
-               if (mask) {\r
-                  for (i=0; i<n; i++)\r
-                        if (mask[i])\r
-                          Mem[i]=GetNearestPaletteIndex(Current->hPal,RGB(red[i],green[i],blue[i]));\r
-               }\r
-               else {\r
-                  for (i=0; i<n; i++)\r
-                        Mem[i]=GetNearestPaletteIndex(Current->hPal,RGB(red[i],green[i],blue[i]));\r
-                       }\r
-       }\r
-   ENDPROFILE(write_color_span)\r
-\r
-}\r
-\r
-/*\r
- * Write a horizontal span of pixels with a boolean mask.  The current color\r
- * is used for all pixels.\r
- */\r
-static void write_monocolor_span( GLcontext* ctx,\r
-                                                                 GLuint n, GLint x, GLint y,\r
-                                                                 const GLubyte mask[])\r
-{\r
-  STARTPROFILE\r
-  GLuint i;\r
-  HDC DC=DD_GETDC;\r
-  PWMC pwc = Current;\r
-\r
-  assert(Current->rgb_flag==GL_TRUE);\r
-  y=FLIP(y);\r
-\r
-  if(Current->rgb_flag==GL_TRUE){\r
-         for (i=0; i<n; i++)\r
-               if (mask[i])\r
-// Trying\r
-               wmSetPixel(pwc,y,x+i,GetRValue(Current->pixel), GetGValue(Current->pixel), GetBValue(Current->pixel));\r
-  }\r
-  else {\r
-         for (i=0; i<n; i++)\r
-               if (mask[i])\r
-                       SetPixel(DC, y, x+i, Current->pixel);\r
-  }\r
-\r
-       DD_RELEASEDC;\r
-\r
-       ENDPROFILE(write_monocolor_span)\r
-}\r
-\r
-\r
-\r
-/**********************************************************************/\r
-/*****                   Array-based pixel drawing                *****/\r
-/**********************************************************************/\r
-\r
-\r
-/* Write an array of pixels with a boolean mask. */\r
-static void write_index_pixels( GLcontext* ctx,\r
-                                                           GLuint n, const GLint x[], const GLint y[],\r
-                                                               const GLuint index[], const GLubyte mask[] )\r
-{\r
-   STARTPROFILE\r
-   GLuint i;\r
-   assert(Current->rgb_flag==GL_FALSE);\r
-   for (i=0; i<n; i++) {\r
-      if (mask[i]) {\r
-         char *Mem=Current->ScreenMem+y[i]*Current->ScanWidth+x[i];\r
-                  *Mem = index[i];\r
-      }\r
-   }\r
-   ENDPROFILE(write_index_pixels)\r
-}\r
-\r
-\r
-\r
-/*\r
- * Write an array of pixels with a boolean mask.  The current color\r
- * index is used for all pixels.\r
- */\r
-static void write_monoindex_pixels( GLcontext* ctx,\r
-                                                                   GLuint n,\r
-                                                                       const GLint x[], const GLint y[],\r
-                                    const GLubyte mask[] )\r
-{\r
-   STARTPROFILE\r
-   GLuint i;\r
-   assert(Current->rgb_flag==GL_FALSE);\r
-   for (i=0; i<n; i++) {\r
-      if (mask[i]) {\r
-         char *Mem=Current->ScreenMem+y[i]*Current->ScanWidth+x[i];\r
-                       *Mem = Current->pixel;\r
-      }\r
-   }\r
-   ENDPROFILE(write_monoindex_pixels)\r
-}\r
-\r
-\r
-\r
-/* Write an array of pixels with a boolean mask. */\r
-static void write_color_pixels( GLcontext* ctx,\r
-                                                           GLuint n, const GLint x[], const GLint y[],\r
-                                                               const GLubyte r[], const GLubyte g[],\r
-                                const GLubyte b[], const GLubyte a[],\r
-                                const GLubyte mask[] )\r
-{\r
-       STARTPROFILE\r
-       GLuint i;\r
-       PWMC    pwc = Current;\r
-       HDC DC=DD_GETDC;\r
-       assert(Current->rgb_flag==GL_TRUE);\r
-       for (i=0; i<n; i++)\r
-               if (mask[i])\r
-                       wmSetPixel(pwc, FLIP(y[i]),x[i],r[i],g[i],b[i]);\r
-       DD_RELEASEDC;\r
-       ENDPROFILE(write_color_pixels)\r
-}\r
-\r
-\r
-\r
-/*\r
- * Write an array of pixels with a boolean mask.  The current color\r
- * is used for all pixels.\r
- */\r
-static void write_monocolor_pixels( GLcontext* ctx,\r
-                                                                   GLuint n,\r
-                                                                       const GLint x[], const GLint y[],\r
-                                    const GLubyte mask[] )\r
-{\r
-       STARTPROFILE\r
-       GLuint i;\r
-       PWMC    pwc = Current;\r
-       HDC DC=DD_GETDC;\r
-       assert(Current->rgb_flag==GL_TRUE);\r
-       for (i=0; i<n; i++)\r
-               if (mask[i])\r
-                       wmSetPixel(pwc, FLIP(y[i]),x[i],GetRValue(Current->pixel),\r
-                                           GetGValue(Current->pixel), GetBValue(Current->pixel));\r
-       DD_RELEASEDC;\r
-       ENDPROFILE(write_monocolor_pixels)\r
-}\r
-\r
-\r
-\r
-/**********************************************************************/\r
-/*****            Read spans/arrays of pixels                     *****/\r
-/**********************************************************************/\r
-\r
-\r
-/* Read a horizontal span of color-index pixels. */\r
-static void read_index_span( GLcontext* ctx, GLuint n, GLint x, GLint y, GLuint index[])\r
-{\r
-  STARTPROFILE\r
-  GLuint i;\r
-  char *Mem=Current->ScreenMem+y*Current->ScanWidth+x;\r
-  assert(Current->rgb_flag==GL_FALSE);\r
-  for (i=0; i<n; i++)\r
-    index[i]=Mem[i];\r
-  ENDPROFILE(read_index_span)\r
-\r
-}\r
-\r
-\r
-\r
-\r
-/* Read an array of color index pixels. */\r
-static void read_index_pixels( GLcontext* ctx,\r
-                                                          GLuint n, const GLint x[], const GLint y[],\r
-                                                          GLuint indx[], const GLubyte mask[] )\r
-{\r
-   STARTPROFILE\r
-   GLuint i;\r
-  assert(Current->rgb_flag==GL_FALSE);\r
-  for (i=0; i<n; i++) {\r
-     if (mask[i]) {\r
-        indx[i]=*(Current->ScreenMem+y[i]*Current->ScanWidth+x[i]);\r
-     }\r
-  }\r
-   ENDPROFILE(read_index_pixels)\r
-}\r
-\r
-\r
-\r
-/* Read a horizontal span of color pixels. */\r
-static void read_color_span( GLcontext* ctx,\r
-                                                        GLuint n, GLint x, GLint y,\r
-                                                        GLubyte red[], GLubyte green[],\r
-                             GLubyte blue[], GLubyte alpha[] )\r
-{\r
-   STARTPROFILE\r
-  UINT i;\r
-  COLORREF Color;\r
-  HDC DC=DD_GETDC;\r
-  assert(Current->rgb_flag==GL_TRUE);\r
-  y=FLIP(y);\r
-  for (i=0; i<n; i++)\r
-  {\r
-    Color=GetPixel(DC,x+i,y);\r
-    red[i]=GetRValue(Color);\r
-    green[i]=GetGValue(Color);\r
-    blue[i]=GetBValue(Color);\r
-    alpha[i]=255;\r
-  }\r
-  DD_RELEASEDC;\r
-  memset(alpha,0,n*sizeof(GLint));\r
-   ENDPROFILE(read_color_span)\r
-}\r
-\r
-\r
-/* Read an array of color pixels. */\r
-static void read_color_pixels( GLcontext* ctx,\r
-                                                          GLuint n, const GLint x[], const GLint y[],\r
-                                                          GLubyte red[], GLubyte green[],\r
-                               GLubyte blue[], GLubyte alpha[],\r
-                               const GLubyte mask[] )\r
-{\r
-   STARTPROFILE\r
-  GLuint i;\r
-  COLORREF Color;\r
-  HDC DC=DD_GETDC;\r
-  assert(Current->rgb_flag==GL_TRUE);\r
-  for (i=0; i<n; i++) {\r
-     if (mask[i]) {\r
-        Color=GetPixel(DC,x[i],FLIP(y[i]));\r
-        red[i]=GetRValue(Color);\r
-        green[i]=GetGValue(Color);\r
-        blue[i]=GetBValue(Color);\r
-        alpha[i]=255;\r
-     }\r
-  }\r
-  DD_RELEASEDC;\r
-  memset(alpha,0,n*sizeof(GLint));\r
-   ENDPROFILE(read_color_pixels)\r
-}\r
-\r
-\r
-\r
-/**********************************************************************/\r
-/**********************************************************************/\r
-\r
-\r
-\r
-void setup_DD_pointers( GLcontext* ctx )\r
-{\r
-   ctx->Driver.Finish = finish;\r
-   ctx->Driver.Flush = flush;\r
-\r
-   ctx->Driver.ClearIndex = clear_index;\r
-   ctx->Driver.ClearColor = clear_color;\r
-   ctx->Driver.Clear = clear;\r
-\r
-   ctx->Driver.Index = set_index;\r
-   ctx->Driver.Color = set_color;\r
-\r
-   ctx->Driver.SetBuffer = set_buffer;\r
-   ctx->Driver.GetBufferSize = buffer_size;\r
-\r
-   ctx->Driver.PointsFunc = choose_points_function(ctx);\r
-   ctx->Driver.LineFunc = choose_line_function(ctx);\r
-   ctx->Driver.TriangleFunc = choose_triangle_function( ctx );\r
-   //   ctx->Driver.TriangleFunc = choose_polygon_function(ctx);\r
-\r
-   /* Pixel/span writing functions: */\r
-   ctx->Driver.WriteColorSpan       = write_color_span;\r
-   ctx->Driver.WriteMonocolorSpan   = write_monocolor_span;\r
-   ctx->Driver.WriteColorPixels     = write_color_pixels;\r
-   ctx->Driver.WriteMonocolorPixels = write_monocolor_pixels;\r
-   ctx->Driver.WriteIndexSpan       = write_index_span;\r
-   ctx->Driver.WriteMonoindexSpan   = write_monoindex_span;\r
-   ctx->Driver.WriteIndexPixels     = write_index_pixels;\r
-   ctx->Driver.WriteMonoindexPixels = write_monoindex_pixels;\r
-\r
-   /* Pixel/span reading functions: */\r
-   ctx->Driver.ReadIndexSpan = read_index_span;\r
-   ctx->Driver.ReadColorSpan = read_color_span;\r
-   ctx->Driver.ReadIndexPixels = read_index_pixels;\r
-   ctx->Driver.ReadColorPixels = read_color_pixels;\r
-}\r
-\r
-//\r
-// MesaGL32 is the DLL version of MesaGL for Win32\r
-//\r
-\r
-/**********************************************************************/\r
-/*****                  WMesa API Functions                       *****/\r
-/**********************************************************************/\r
-\r
-\r
-\r
-#define PAL_SIZE 256\r
-static void GetPalette(HPALETTE Pal,RGBQUAD *aRGB)\r
-{\r
-   STARTPROFILE\r
-       int i;\r
-       HDC hdc;\r
-       struct\r
-       {\r
-               WORD Version;\r
-               WORD NumberOfEntries;\r
-               PALETTEENTRY aEntries[PAL_SIZE];\r
-       } Palette =\r
-       {\r
-               0x300,\r
-               PAL_SIZE\r
-       };\r
-       hdc=GetDC(NULL);\r
-       if (Pal!=NULL)\r
-    GetPaletteEntries(Pal,0,PAL_SIZE,Palette.aEntries);\r
-  else\r
-    GetSystemPaletteEntries(hdc,0,PAL_SIZE,Palette.aEntries);\r
-       if (GetSystemPaletteUse(hdc) == SYSPAL_NOSTATIC)\r
-       {\r
-               for(i = 0; i <PAL_SIZE; i++)\r
-                       Palette.aEntries[i].peFlags = PC_RESERVED;\r
-               Palette.aEntries[255].peRed = 255;\r
-               Palette.aEntries[255].peGreen = 255;\r
-               Palette.aEntries[255].peBlue = 255;\r
-               Palette.aEntries[255].peFlags = 0;\r
-               Palette.aEntries[0].peRed = 0;\r
-               Palette.aEntries[0].peGreen = 0;\r
-               Palette.aEntries[0].peBlue = 0;\r
-               Palette.aEntries[0].peFlags = 0;\r
-       }\r
-       else\r
-       {\r
-               int nStaticColors;\r
-               int nUsableColors;\r
-               nStaticColors = GetDeviceCaps(hdc, NUMCOLORS)/2;\r
-               for (i=0; i<nStaticColors; i++)\r
-                       Palette.aEntries[i].peFlags = 0;\r
-               nUsableColors = PAL_SIZE-nStaticColors;\r
-               for (; i<nUsableColors; i++)\r
-                       Palette.aEntries[i].peFlags = PC_RESERVED;\r
-               for (; i<PAL_SIZE-nStaticColors; i++)\r
-                       Palette.aEntries[i].peFlags = PC_RESERVED;\r
-               for (i=PAL_SIZE-nStaticColors; i<PAL_SIZE; i++)\r
-                       Palette.aEntries[i].peFlags = 0;\r
-       }\r
-       ReleaseDC(NULL,hdc);\r
-  for (i=0; i<PAL_SIZE; i++)\r
-  {\r
-    aRGB[i].rgbRed=Palette.aEntries[i].peRed;\r
-    aRGB[i].rgbGreen=Palette.aEntries[i].peGreen;\r
-    aRGB[i].rgbBlue=Palette.aEntries[i].peBlue;\r
-    aRGB[i].rgbReserved=Palette.aEntries[i].peFlags;\r
-  }\r
-         ENDPROFILE(GetPalette)\r
-}\r
-\r
-\r
-WMesaContext /*APIENTRY*/ WMesaCreateContext( HWND hWnd, HPALETTE Pal,\r
-                                                                                        /*HDC hDC,*/ GLboolean rgb_flag,\r
-                                                                                         GLboolean db_flag )\r
-{\r
-  BITMAPINFO *Rec;\r
-  //HDC DC;\r
-  RECT CR;\r
-  WMesaContext c;\r
-\r
-  c = (struct wmesa_context * ) calloc(1,sizeof(struct wmesa_context));\r
-  if (!c)\r
-    return NULL;\r
-\r
-  c->Window=hWnd;\r
-  c->hDC = GetDC(hWnd);\r
-\r
-  if (rgb_flag==GL_FALSE)\r
-  {\r
-    c->rgb_flag = GL_FALSE;\r
-    c->pixel = 1;\r
-    db_flag=GL_TRUE; // WinG requires double buffering\r
-    //c->gl_ctx->BufferDepth = windepth;\r
-  }\r
-  else\r
-  {\r
-    c->rgb_flag = GL_TRUE;\r
-    c->pixel = 0;\r
-  }\r
-  GetClientRect(c->Window,&CR);\r
-  c->width=CR.right;\r
-  c->height=CR.bottom;\r
-  if (db_flag)\r
-  {\r
-    c->db_flag = 1;\r
-//     c->hDC GetDC(c->Window);\r
-       /* Double buffered */\r
-    if (c->rgb_flag==GL_TRUE)\r
-    {\r
-      //DC = c->hDC = hDC;\r
-\r
-//             DC = c->hDC = GetDC(c->Window);\r
-               wmCreateBackingStore(c, c->width, c->height);\r
-//             ReleaseDC(c->Window,DC);\r
-    }\r
-    else\r
-    {\r
-      c->dib.hDC=WinGCreateDC();\r
-      Rec=(BITMAPINFO *) malloc(sizeof(BITMAPINFO)+(PAL_SIZE-1)*sizeof(RGBQUAD));\r
-      c->hPal=Pal;\r
-      GetPalette(Pal,Rec->bmiColors);\r
-      WinGRecommendDIBFormat(Rec);\r
-      Rec->bmiHeader.biWidth=c->width;\r
-      Rec->bmiHeader.biHeight*=c->height;\r
-      Rec->bmiHeader.biClrUsed=PAL_SIZE;\r
-      if (Rec->bmiHeader.biPlanes!=1 || Rec->bmiHeader.biBitCount!=8)\r
-      {\r
-        MessageBox(NULL,"Error.","This code presumes a 256 color, single plane, WinG Device.\n",MB_OK);\r
-        exit(1);\r
-      }\r
-      c->Compat_BM=WinGCreateBitmap(c->dib.hDC,Rec,&((void *) c->ScreenMem));\r
-      c->Old_Compat_BM=SelectObject(c->dib.hDC,c->Compat_BM);\r
-      WinGSetDIBColorTable(c->dib.hDC,0,PAL_SIZE,Rec->bmiColors);\r
-      c->IndexFormat=Rec;\r
-      c->ScanWidth=c->width;\r
-         c->cColorBits = 8;\r
-      if ((c->ScanWidth%sizeof(long))!=0)\r
-        c->ScanWidth+=(sizeof(long)-(c->ScanWidth%sizeof(long)));\r
-    }\r
-  }\r
-  else\r
-  {\r
-    /* Single Buffered */\r
-       c->db_flag = 0;\r
-\r
-//     wmCreateBackingStore(c, c->width, c->height);\r
-  }\r
-\r
-\r
-\r
-  c->gl_visual = _mesa_create_visual(rgb_flag,\r
-                                     db_flag,  /* db_flag */\r
-                                     GL_TRUE,   /* stereo */\r
-                                     8, 8, 8, 8,/* rgba bits */\r
-                                     0,         /* index bits */\r
-                                     16,       /* depth_bits */\r
-                                     8,                /* stencil_bits */\r
-                                     16,16,16,16,/* accum_bits */\r
-                                     1 );\r
-\r
-       if (!c->gl_visual) {\r
-         return NULL;\r
-      }\r
-\r
-  /* allocate a new Mesa context */\r
-  c->gl_ctx = _mesa_create_context( c->gl_visual, NULL, (void *) g, GL_FALSE );\r
-\r
-  if (!c->gl_ctx) {\r
-         _mesa_destroy_visual( c->gl_visual );\r
-         free(c);\r
-         return NULL;\r
-      }\r
-\r
-      c->gl_buffer = _mesa_create_framebuffer( c->gl_visual );\r
-      if (!c->gl_buffer) {\r
-         _mesa_destroy_visual( c->gl_visual );\r
-         _mesa_destroy_context( c->gl_ctx );\r
-         free(c);\r
-         return NULL;\r
-      }\r
-//  setup_DD_pointers(c->gl_ctx);\r
-\r
-  return c;\r
-}\r
-\r
-\r
-\r
-void /*APIENTRY*/ WMesaDestroyContext( void )\r
-{\r
-       WMesaContext c = Current;\r
-       ReleaseDC(c->Window,c->hDC);\r
-       WC = c;\r
-\r
-    _mesa_destroy_visual( c->gl_visual );\r
-    _mesa_destroy_framebuffer( c->gl_buffer );\r
-    _mesa_destroy_context( c->gl_ctx );\r
-\r
-       if (c->db_flag){\r
-               wmDeleteBackingStore(c);\r
-\r
-//Code added by Li Wei to enable parallel render\r
-#if !defined(NO_STEREO)\r
-               if(stereoBuffer==GL_TRUE){\r
-                       WMesaDestroyStereoBuffer();\r
-                       stereoBuffer=GL_FALSE;\r
-               }\r
-#endif\r
-// End modification\r
-       }\r
-       free( (void *) c );\r
-//Code added by Li Wei to enable parallel render\r
-// Parallel render only work in double buffer mode\r
-#if !defined(NO_PARALLEL)\r
-       if(parallelMachine)\r
-               PRDestroyRenderBuffer();\r
-#endif\r
-// End modification\r
-}\r
-\r
-\r
-\r
-void /*APIENTRY*/ WMesaMakeCurrent( WMesaContext c )\r
-{\r
-       if(!c){\r
-               Current = c;\r
-               return;\r
-       }\r
-\r
-       //\r
-       // A little optimization\r
-       // If it already is current,\r
-       // don't set it again\r
-       //\r
-       if(Current == c)\r
-               return;\r
-\r
-       //gl_set_context( c->gl_ctx );\r
-       _mesa_make_current(c->gl_ctx, c->gl_buffer);\r
-       Current = c;\r
-       setup_DD_pointers(c->gl_ctx);\r
-       if (Current->gl_ctx->Viewport.Width==0) {\r
-         /* initialize viewport to window size */\r
-         _mesa_set_viewport( Current->gl_ctx,\r
-                          0, 0, Current->width, Current->height );\r
-       }\r
-}\r
-\r
-\r
-\r
-void /*APIENTRY*/ WMesaSwapBuffers( void )\r
-{\r
-  HDC DC = Current->hDC;\r
-  if (Current->db_flag)\r
-  {\r
-    if (Current->rgb_flag)\r
-               wmFlush(Current);\r
-    else\r
-      WinGBitBlt(DC,0,0,Current->width,Current->height,Current->dib.hDC,0,0);\r
-  }\r
-}\r
-\r
-\r
-\r
-void /*APIENTRY*/ WMesaPaletteChange(HPALETTE Pal)\r
-{\r
-  if (Current && Current->rgb_flag==GL_FALSE)\r
-  {\r
-    Current->hPal=Pal;\r
-    GetPalette(Pal,Current->IndexFormat->bmiColors);\r
-    WinGSetDIBColorTable(Current->dib.hDC,0,PAL_SIZE,Current->IndexFormat->bmiColors);\r
-  }\r
-}\r
-\r
-//\r
-// Free up the dib section that was created\r
-//\r
-BOOL wmDeleteBackingStore(PWMC pwc)\r
-{\r
-       SelectObject(pwc->dib.hDC, pwc->hOldBitmap);\r
-       DeleteDC(pwc->dib.hDC);\r
-       DeleteObject(pwc->hbmDIB);\r
-       UnmapViewOfFile(pwc->dib.base);\r
-       CloseHandle(pwc->dib.hFileMap);\r
-       return TRUE;\r
-}\r
-\r
-\r
-//\r
-// This function creates the DIB section that is used for combined\r
-// GL and GDI calls\r
-//\r
-BOOL /*WINAPI*/ wmCreateBackingStore(PWMC pwc, long lxSize, long lySize)\r
-{\r
-    HDC hdc = pwc->hDC;\r
-    LPBITMAPINFO pbmi = &(pwc->bmi);\r
-       int             iUsage;\r
-\r
-    pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);\r
-    pbmi->bmiHeader.biWidth = lxSize;\r
-    pbmi->bmiHeader.biHeight= -lySize;\r
-    pbmi->bmiHeader.biPlanes = 1;\r
-    pbmi->bmiHeader.biBitCount = GetDeviceCaps(pwc->hDC, BITSPIXEL);\r
-    pbmi->bmiHeader.biCompression = BI_RGB;\r
-    pbmi->bmiHeader.biSizeImage = 0;\r
-    pbmi->bmiHeader.biXPelsPerMeter = 0;\r
-    pbmi->bmiHeader.biYPelsPerMeter = 0;\r
-    pbmi->bmiHeader.biClrUsed = 0;\r
-    pbmi->bmiHeader.biClrImportant = 0;\r
-\r
-       iUsage = (pbmi->bmiHeader.biBitCount <= 8) ? DIB_PAL_COLORS : DIB_RGB_COLORS;\r
-\r
-       pwc->cColorBits = pbmi->bmiHeader.biBitCount;\r
-       pwc->ScanWidth = lxSize;\r
-\r
-       wmCreateDIBSection(hdc, pwc, pbmi, iUsage);\r
-\r
-       if ((iUsage == DIB_PAL_COLORS) && !(pwc->hGLPalette)) {\r
-               wmCreatePalette( pwc );\r
-               wmSetDibColors( pwc );\r
-       }\r
-\r
-       return(TRUE);\r
-\r
-}\r
-\r
-\r
-//\r
-// This function copies one scan line in a DIB section to another\r
-//\r
-BOOL GLWINAPI wmSetDIBits(PWMC pwc, UINT uiScanWidth, UINT uiNumScans, UINT nBypp, UINT uiNewWidth, LPBYTE pBits)\r
-{\r
-       UINT uiScans = 0;\r
-       LPBYTE  pDest = pwc->pbPixels;\r
-       DWORD   dwNextScan = uiScanWidth;\r
-       DWORD   dwNewScan = uiNewWidth;\r
-       DWORD   dwScanWidth = (uiScanWidth * nBypp);\r
-\r
-       //\r
-       // We need to round up to the nearest DWORD\r
-       // and multiply by the number of bytes per\r
-       // pixel\r
-       //\r
-       dwNextScan = (((dwNextScan * nBypp)+ 3) & ~3);\r
-       dwNewScan = (((dwNewScan * nBypp)+ 3) & ~3);\r
-\r
-       for(uiScans = 0; uiScans < uiNumScans; uiScans++){\r
-               CopyMemory(pDest, pBits, dwScanWidth);\r
-               pBits += dwNextScan;\r
-               pDest += dwNewScan;\r
-       }\r
-\r
-       return(TRUE);\r
-\r
-}\r
-\r
-BOOL GLWINAPI wmSetPixelFormat( PWMC pwdc, HDC hDC, DWORD dwFlags )\r
-{\r
-       return(TRUE);\r
-}\r
-\r
-static unsigned char threeto8[8] = {\r
-       0, 0111>>1, 0222>>1, 0333>>1, 0444>>1, 0555>>1, 0666>>1, 0377\r
-};\r
-\r
-static unsigned char twoto8[4] = {\r
-       0, 0x55, 0xaa, 0xff\r
-};\r
-\r
-static unsigned char oneto8[2] = {\r
-       0, 255\r
-};\r
-\r
-static unsigned char componentFromIndex(UCHAR i, UINT nbits, UINT shift)\r
-{\r
-       unsigned char val;\r
-\r
-       val = i >> shift;\r
-       switch (nbits) {\r
-\r
-               case 1:\r
-                       val &= 0x1;\r
-                       return oneto8[val];\r
-\r
-               case 2:\r
-                       val &= 0x3;\r
-                       return twoto8[val];\r
-\r
-               case 3:\r
-                       val &= 0x7;\r
-                       return threeto8[val];\r
-\r
-               default:\r
-                       return 0;\r
-       }\r
-}\r
-\r
-void /*WINAPI*/ wmCreatePalette( PWMC pwdc )\r
-{\r
-    /* Create a compressed and re-expanded 3:3:2 palette */\r
-       int            i;\r
-       LOGPALETTE     *pPal;\r
-    BYTE           rb, rs, gb, gs, bb, bs;\r
-\r
-    pwdc->nColors = 0x100;\r
-\r
-       pPal = (PLOGPALETTE)malloc(sizeof(LOGPALETTE) + pwdc->nColors * sizeof(PALETTEENTRY));\r
-    memset( pPal, 0, sizeof(LOGPALETTE) + pwdc->nColors * sizeof(PALETTEENTRY) );\r
-\r
-       pPal->palVersion = 0x300;\r
-\r
-    rb = REDBITS;\r
-    rs = REDSHIFT;\r
-    gb = GREENBITS;\r
-    gs = GREENSHIFT;\r
-    bb = BLUEBITS;\r
-    bs = BLUESHIFT;\r
-\r
-    if (pwdc->db_flag) {\r
-\r
-        /* Need to make two palettes: one for the screen DC and one for the DIB. */\r
-           pPal->palNumEntries = pwdc->nColors;\r
-           for (i = 0; i < pwdc->nColors; i++) {\r
-                   pPal->palPalEntry[i].peRed = componentFromIndex( i, rb, rs );\r
-                   pPal->palPalEntry[i].peGreen = componentFromIndex( i, gb, gs );\r
-                   pPal->palPalEntry[i].peBlue = componentFromIndex( i, bb, bs );\r
-                   pPal->palPalEntry[i].peFlags = 0;\r
-           }\r
-       pwdc->hGLPalette = CreatePalette( pPal );\r
-       pwdc->hPalette = CreatePalette( pPal );\r
-    }\r
-\r
-       else {\r
-           pPal->palNumEntries = pwdc->nColors;\r
-           for (i = 0; i < pwdc->nColors; i++) {\r
-                   pPal->palPalEntry[i].peRed = componentFromIndex( i, rb, rs );\r
-                   pPal->palPalEntry[i].peGreen = componentFromIndex( i, gb, gs );\r
-                   pPal->palPalEntry[i].peBlue = componentFromIndex( i, bb, bs );\r
-                   pPal->palPalEntry[i].peFlags = 0;\r
-           }\r
-       pwdc->hGLPalette = CreatePalette( pPal );\r
-    }\r
-\r
-       free(pPal);\r
-\r
-}\r
-\r
-//\r
-// This function sets the color table of a DIB section\r
-// to match that of the destination DC\r
-//\r
-BOOL /*WINAPI*/ wmSetDibColors(PWMC pwc)\r
-{\r
-    RGBQUAD                    *pColTab, *pRGB;\r
-    PALETTEENTRY       *pPal, *pPE;\r
-    int                                i, nColors;\r
-       BOOL                    bRet=TRUE;\r
-       DWORD                   dwErr=0;\r
-\r
-    /* Build a color table in the DIB that maps to the\r
-       selected palette in the DC.\r
-       */\r
-    nColors = 1 << pwc->cColorBits;\r
-       pPal = (PALETTEENTRY *)malloc( nColors * sizeof(PALETTEENTRY));\r
-    memset( pPal, 0, nColors * sizeof(PALETTEENTRY) );\r
-    GetPaletteEntries( pwc->hGLPalette, 0, nColors, pPal );\r
-    pColTab = (RGBQUAD *)malloc( nColors * sizeof(RGBQUAD));\r
-    for (i = 0, pRGB = pColTab, pPE = pPal; i < nColors; i++, pRGB++, pPE++) {\r
-        pRGB->rgbRed = pPE->peRed;\r
-        pRGB->rgbGreen = pPE->peGreen;\r
-        pRGB->rgbBlue = pPE->peBlue;\r
-    }\r
-       if(pwc->db_flag)\r
-           bRet = SetDIBColorTable(pwc->hDC, 0, nColors, pColTab );\r
-\r
-       if(!bRet)\r
-               dwErr = GetLastError();\r
-\r
-    free( pColTab );\r
-    free( pPal );\r
-\r
-       return(bRet);\r
-}\r
-\r
-void /*WINAPI*/ wmSetPixel(PWMC pwc, int iScanLine, int iPixel, BYTE r, BYTE g, BYTE b)\r
-{\r
-       if(Current->db_flag){\r
-               LPBYTE  lpb = pwc->pbPixels;\r
-               LPDWORD lpdw;\r
-               LPWORD  lpw;\r
-               UINT    nBypp = pwc->cColorBits / 8;\r
-               UINT    nOffset = iPixel % nBypp;\r
-\r
-               // Move the pixel buffer pointer to the scanline that we\r
-               // want to access\r
-\r
-               pwc->dib.fFlushed = FALSE;\r
-\r
-               lpb += pwc->ScanWidth * iScanLine;\r
-               // Now move to the desired pixel\r
-               lpb += iPixel * nBypp;\r
-\r
-               lpdw = (LPDWORD)lpb;\r
-               lpw = (LPWORD)lpb;\r
-\r
-               if(nBypp == 2)\r
-                       *lpw = BGR16(r,g,b);\r
-               else if (nBypp == 3){\r
-                       *lpdw = BGR24(r,g,b);\r
-               }\r
-               else\r
-                       *lpdw = BGR32(r,g,b);\r
-       }\r
-       else{\r
-               HDC DC = DD_GETDC;\r
-               SetPixel(DC, iPixel, iScanLine, RGB(r,g,b));\r
-               DD_RELEASEDC;\r
-       }\r
-}\r
-\r
-void /*WINAPI*/ wmCreateDIBSection(\r
-       HDC      hDC,\r
-    PWMC pwc,  // handle of device context\r
-    CONST BITMAPINFO *pbmi,    // address of structure containing bitmap size, format, and color data\r
-    UINT iUsage        // color data type indicator: RGB values or palette indices\r
-)\r
-{\r
-       DWORD   dwSize = 0;\r
-       DWORD   dwScanWidth;\r
-       UINT    nBypp = pwc->cColorBits / 8;\r
-       HDC             hic;\r
-\r
-       dwScanWidth = (((pwc->ScanWidth * nBypp)+ 3) & ~3);\r
-\r
-       pwc->ScanWidth = dwScanWidth;\r
-\r
-       dwSize = sizeof(BITMAPINFO) + (dwScanWidth * pwc->height);\r
-\r
-       pwc->dib.hFileMap = CreateFileMapping((HANDLE)PAGE_FILE,\r
-                                                                                 NULL,\r
-                                                                                 PAGE_READWRITE | SEC_COMMIT,\r
-                                                                                 0,\r
-                                                                                 dwSize,\r
-                                                                                 NULL);\r
-\r
-       if (!pwc->dib.hFileMap)\r
-               return;\r
-\r
-       pwc->dib.base = MapViewOfFile(pwc->dib.hFileMap,\r
-                                                                 FILE_MAP_ALL_ACCESS,\r
-                                                                 0,\r
-                                                                 0,\r
-                                                                 0);\r
-\r
-       if(!pwc->dib.base){\r
-               CloseHandle(pwc->dib.hFileMap);\r
-               return;\r
-       }\r
-\r
-       pwc->pbPixels = ((LPBYTE)pwc->dib.base) + sizeof(BITMAPINFO);\r
-\r
-       pwc->dib.hDC = CreateCompatibleDC(hDC);\r
-\r
-       CopyMemory(pwc->dib.base, pbmi, sizeof(BITMAPINFO));\r
-\r
-       hic = CreateIC("display", NULL, NULL, NULL);\r
-\r
-/*     pwc->hbmDIB = CreateDIBitmap(hic,\r
-                                                &(pwc->bmi.bmiHeader),\r
-                                                CBM_INIT,\r
-                                                pwc->pbPixels,\r
-                                                &(pwc->bmi),\r
-                                                DIB_RGB_COLORS);\r
-*/\r
-  pwc->hbmDIB = CreateDIBSection(hic,\r
-                                               &(pwc->bmi.bmiHeader),\r
-                                               DIB_RGB_COLORS,\r
-                                               &(pwc->pbPixels),\r
-                                               pwc->dib.hFileMap,\r
-                                               0);\r
-       pwc->hOldBitmap = SelectObject(pwc->dib.hDC, pwc->hbmDIB);\r
-\r
-       DeleteDC(hic);\r
-\r
-       return;\r
-\r
-}\r
-\r
-//\r
-// Blit memory DC to screen DC\r
-//\r
-BOOL /*WINAPI*/ wmFlush(PWMC pwc)\r
-{\r
-       BOOL    bRet = 0;\r
-       DWORD   dwErr = 0;\r
-\r
-\r
-//     wmFlushBits(pwc);\r
-\r
-       bRet = BitBlt(pwc->hDC, 0, 0, pwc->width, pwc->height,\r
-                  pwc->dib.hDC, 0, 0, SRCCOPY);\r
-\r
-       if(!bRet)\r
-               dwErr = GetLastError();\r
-\r
-       pwc->dib.fFlushed = TRUE;\r
-\r
-       return(TRUE);\r
-\r
-}\r
-\r
-\r
-// The following code is added by Li Wei to enable stereo display\r
-\r
-#if !defined(NO_STEREO)\r
-\r
-void WMesaCreateStereoBuffer()\r
-{\r
-       /* Must use double buffer and not in parallelMode */\r
-       if (! Current->db_flag\r
-#if !defined(NO_PARALLEL)\r
-               || parallelFlag\r
-#endif\r
-               )\r
-               return;\r
-\r
-       Buffer_Stereo = malloc( Current->ScanWidth * Current->height);\r
-       ZeroMemory(Buffer_Stereo,Current->ScanWidth * Current->height);\r
-       stereoBuffer = GL_TRUE ;\r
-}\r
-\r
-void WMesaDestroyStereoBuffer()\r
-{\r
-       /* Must use double buffer and not in parallelMode */\r
-       if (! Current->db_flag\r
-#if !defined(NO_PARALLEL)\r
-               || parallelFlag\r
-#endif\r
-               )\r
-               return;\r
-       if(stereoBuffer){\r
-               free(Buffer_Stereo);\r
-               stereoBuffer = GL_FALSE ;\r
-       }\r
-}\r
-\r
-void WMesaInterleave(GLenum aView)\r
-{\r
-       int offset;\r
-       unsigned line;\r
-       LPBYTE dest;\r
-       LPBYTE src;\r
-       if(aView == FIRST)\r
-               offset = 0;\r
-       else offset = 1;\r
-\r
-       dest = Buffer_Stereo + offset * Current->ScanWidth;\r
-       if(Current->rgb_flag )\r
-               src = Current->pbPixels + Current->ScanWidth*(Current->height/2);\r
-       else\r
-               src = Current->ScreenMem;\r
-\r
-       for(line = 0; line<Current->height/2; line ++){\r
-               CopyMemory(dest, src, Current->ScanWidth);\r
-               dest += 2*Current->ScanWidth;\r
-               src += Current->ScanWidth;\r
-       }\r
-       if(aView == SECOND)\r
-               if(Current->rgb_flag)\r
-                       CopyMemory(Current->pbPixels, Buffer_Stereo, Current->ScanWidth*Current->height);\r
-               else\r
-                       CopyMemory(Current->ScreenMem, Buffer_Stereo, Current->ScanWidth*Current->height);\r
-}\r
-\r
-void WMesaShowStereo(GLuint list)\r
-{\r
-\r
-       GLbitfield mask = GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT;\r
-       GLfloat cm[16];\r
-       // Must use double Buffer\r
-       if( ! Current-> db_flag )\r
-               return;\r
-\r
-       glViewport(0,0,Current->width,Current->height/2);\r
-\r
-       glGetFloatv(GL_MODELVIEW_MATRIX,cm);\r
-       glMatrixMode(GL_MODELVIEW);\r
-       glLoadIdentity();\r
-       gluLookAt(viewDistance/2,0.0,0.0 ,\r
-                        viewDistance/2,0.0,-1.0,\r
-                        0.0,1.0,0.0 );\r
-       glMultMatrixf( cm );\r
-       glMatrixMode(GL_MODELVIEW);\r
-       glPushMatrix();\r
-       glCallList( list );\r
-       glPopMatrix();\r
-       glFlush();\r
-       WMesaInterleave( FIRST );\r
-\r
-       glGetFloatv(GL_MODELVIEW_MATRIX,cm);\r
-       glMatrixMode(GL_MODELVIEW);\r
-       glLoadIdentity();\r
-       gluLookAt(-viewDistance/2,0.0,0.0 ,\r
-                        -viewDistance/2,0.0,-1.0,\r
-                        0.0,1.0,0.0 );\r
-       glMultMatrixf(cm);\r
-       glMatrixMode(GL_MODELVIEW);\r
-       glCallList(list);\r
-       glFlush();\r
-       WMesaInterleave( SECOND );\r
-       glViewport(0,0,Current->width,Current->height);\r
-       WMesaSwapBuffers();\r
-\r
-}\r
-\r
-void toggleStereoMode()\r
-{\r
-       if(!Current->db_flag)\r
-               return;\r
-       if(!stereo_flag){\r
-               stereo_flag = 1;\r
-               if(stereoBuffer==GL_FALSE)\r
-#if !defined(NO_PARALLEL)\r
-                       if(!parallelFlag)\r
-#endif\r
-               {\r
-                       WMesaCreateStereoBuffer();\r
-                       }\r
-       }\r
-       else {\r
-               stereo_flag = 0;\r
-       if(stereoBuffer==GL_TRUE)\r
-#if !defined(NO_PARALLEL)\r
-               if(!parallelFlag)\r
-#endif\r
-                       if(stereoBuffer==GL_TRUE){\r
-                               WMesaDestroyStereoBuffer();\r
-                       }\r
-       }\r
-}\r
-\r
-/* if in stereo mode, the following function is called */\r
-void glShowStereo(GLuint list)\r
-{\r
-       WMesaShowStereo(list);\r
-}\r
-\r
-#endif // End if NO_STEREO not defined\r
-\r
-#if !defined(NO_PARALLEL)\r
-\r
-void toggleParallelMode(void)\r
-{\r
-       if(!parallelFlag){\r
-               parallelFlag = GL_TRUE;\r
-               if(parallelMachine==GL_FALSE){\r
-                               PRCreateRenderBuffer( Current->rgb_flag? GL_RGBA :GL_COLOR_INDEX,\r
-                                                                         Current->cColorBits/8,\r
-                                                                         Current->width ,Current->height,\r
-                                                                         Current->ScanWidth,\r
-                                                                         Current->rgb_flag? Current->pbPixels: Current->ScreenMem);\r
-                               parallelMachine = GL_TRUE;\r
-                               }\r
-               }\r
-       else {\r
-               parallelFlag = GL_FALSE;\r
-               if(parallelMachine==GL_TRUE){\r
-                               PRDestroyRenderBuffer();\r
-                               parallelMachine=GL_FALSE;\r
-                               ReadyForNextFrame = GL_TRUE;\r
-                               }\r
-\r
-/***********************************************\r
-// Seems something wrong!!!!\r
-************************************************/\r
-\r
-               WMesaMakeCurrent(Current);\r
-#if !defined(NO_STEREO)\r
-               stereo_flag = GL_FALSE ;\r
-#endif\r
-       }\r
-}\r
-\r
-void PRShowRenderResult(void)\r
-{\r
-       int flag = 0;\r
-if(!glImageRendered())\r
-               return;\r
-\r
-  if (parallelFlag)\r
-       {\r
-         WMesaSwapBuffers();\r
-        }\r
-\r
-}\r
-#endif //End if NO_PARALLEL not defined\r
-\r
-//end modification\r