Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 4357 → Rev 4358

/contrib/sdk/sources/Mesa/src/mesa/drivers/windows/gdi/SConscript
0,0 → 1,38
Import('*')
 
env = env.Clone()
 
env.Prepend(CPPPATH = [
'#src/mapi',
'#src/mesa',
])
 
env.AppendUnique(CPPDEFINES = [
'_GDI32_', # prevent wgl* being declared __declspec(dllimport)
'BUILD_GL32', # declare gl* as __declspec(dllexport) in Mesa headers
])
if not env['gles']:
# prevent _glapi_* from being declared __declspec(dllimport)
env.Append(CPPDEFINES = ['_GLAPI_NO_EXPORTS'])
 
env.Prepend(LIBS = [
glapi,
mesa,
glsl,
'gdi32',
'user32',
'kernel32',
])
 
sources = [
'mesa.def',
'wgl.c',
'wmesa.c',
]
 
mesagdi = env.SharedLibrary(
target = 'opengl32',
source = sources,
)
 
env.Alias('mesagdi', mesagdi)
/contrib/sdk/sources/Mesa/src/mesa/drivers/windows/gdi/colors.h
0,0 → 1,29
/* Values for wmesa->pixelformat: */
 
#define PF_8A8B8G8R 3 /* 32-bit TrueColor: 8-A, 8-B, 8-G, 8-R */
#define PF_8R8G8B 4 /* 32-bit TrueColor: 8-R, 8-G, 8-B */
#define PF_5R6G5B 5 /* 16-bit TrueColor: 5-R, 6-G, 5-B bits */
#define PF_DITHER8 6 /* Dithered RGB using a lookup table */
#define PF_LOOKUP 7 /* Undithered RGB using a lookup table */
#define PF_GRAYSCALE 10 /* Grayscale or StaticGray */
#define PF_BADFORMAT 11
#define PF_INDEX8 12
 
 
#define BGR8(r,g,b) (unsigned)(((BYTE)((b & 0xc0) | ((g & 0xe0)>>2) | \
((r & 0xe0)>>5))))
 
/* Windows uses 5,5,5 for 16-bit */
#define BGR16(r,g,b) ( (((unsigned short)b ) >> 3) | \
(((unsigned short)g & 0xf8) << 2) | \
(((unsigned short)r & 0xf8) << 7) )
 
#define BGR24(r,g,b) (unsigned long)((DWORD)(((BYTE)(b)| \
((WORD)((BYTE)(g))<<8))| \
(((DWORD)(BYTE)(r))<<16)))
 
#define BGR32(r,g,b) (unsigned long)((DWORD)(((BYTE)(b)| \
((WORD)((BYTE)(g))<<8))| \
(((DWORD)(BYTE)(r))<<16)))
 
 
/contrib/sdk/sources/Mesa/src/mesa/drivers/windows/gdi/mesa.def
0,0 → 1,840
; DO NOT EDIT - This file generated automatically by mesadef.py script
;DESCRIPTION 'Mesa (OpenGL work-alike) for Win32'
VERSION 6.5
;
; Module definition file for Mesa (OPENGL32.DLL)
;
; Note: The OpenGL functions use the STDCALL
; function calling convention. Microsoft's
; OPENGL32 uses this convention and so must the
; Mesa OPENGL32 so that the Mesa DLL can be used
; as a drop-in replacement.
;
; The linker exports STDCALL entry points with
; 'decorated' names; e.g., _glBegin@0, where the
; trailing number is the number of bytes of
; parameter data pushed onto the stack. The
; callee is responsible for popping this data
; off the stack, usually via a RETF n instruction.
;
; However, the Microsoft OPENGL32.DLL does not export
; the decorated names, even though the calling convention
; is STDCALL. So, this module definition file is
; needed to force the Mesa OPENGL32.DLL to export the
; symbols in the same manner as the Microsoft DLL.
; Were it not for this problem, this file would not
; be needed (for the gl* functions) since the entry
; points are compiled with dllexport declspec.
;
EXPORTS
glNewList
glEndList
glCallList
glCallLists
glDeleteLists
glGenLists
glListBase
glBegin
glBitmap
glColor3b
glColor3bv
glColor3d
glColor3dv
glColor3f
glColor3fv
glColor3i
glColor3iv
glColor3s
glColor3sv
glColor3ub
glColor3ubv
glColor3ui
glColor3uiv
glColor3us
glColor3usv
glColor4b
glColor4bv
glColor4d
glColor4dv
glColor4f
glColor4fv
glColor4i
glColor4iv
glColor4s
glColor4sv
glColor4ub
glColor4ubv
glColor4ui
glColor4uiv
glColor4us
glColor4usv
glEdgeFlag
glEdgeFlagv
glEnd
glIndexd
glIndexdv
glIndexf
glIndexfv
glIndexi
glIndexiv
glIndexs
glIndexsv
glNormal3b
glNormal3bv
glNormal3d
glNormal3dv
glNormal3f
glNormal3fv
glNormal3i
glNormal3iv
glNormal3s
glNormal3sv
glRasterPos2d
glRasterPos2dv
glRasterPos2f
glRasterPos2fv
glRasterPos2i
glRasterPos2iv
glRasterPos2s
glRasterPos2sv
glRasterPos3d
glRasterPos3dv
glRasterPos3f
glRasterPos3fv
glRasterPos3i
glRasterPos3iv
glRasterPos3s
glRasterPos3sv
glRasterPos4d
glRasterPos4dv
glRasterPos4f
glRasterPos4fv
glRasterPos4i
glRasterPos4iv
glRasterPos4s
glRasterPos4sv
glRectd
glRectdv
glRectf
glRectfv
glRecti
glRectiv
glRects
glRectsv
glTexCoord1d
glTexCoord1dv
glTexCoord1f
glTexCoord1fv
glTexCoord1i
glTexCoord1iv
glTexCoord1s
glTexCoord1sv
glTexCoord2d
glTexCoord2dv
glTexCoord2f
glTexCoord2fv
glTexCoord2i
glTexCoord2iv
glTexCoord2s
glTexCoord2sv
glTexCoord3d
glTexCoord3dv
glTexCoord3f
glTexCoord3fv
glTexCoord3i
glTexCoord3iv
glTexCoord3s
glTexCoord3sv
glTexCoord4d
glTexCoord4dv
glTexCoord4f
glTexCoord4fv
glTexCoord4i
glTexCoord4iv
glTexCoord4s
glTexCoord4sv
glVertex2d
glVertex2dv
glVertex2f
glVertex2fv
glVertex2i
glVertex2iv
glVertex2s
glVertex2sv
glVertex3d
glVertex3dv
glVertex3f
glVertex3fv
glVertex3i
glVertex3iv
glVertex3s
glVertex3sv
glVertex4d
glVertex4dv
glVertex4f
glVertex4fv
glVertex4i
glVertex4iv
glVertex4s
glVertex4sv
glClipPlane
glColorMaterial
glCullFace
glFogf
glFogfv
glFogi
glFogiv
glFrontFace
glHint
glLightf
glLightfv
glLighti
glLightiv
glLightModelf
glLightModelfv
glLightModeli
glLightModeliv
glLineStipple
glLineWidth
glMaterialf
glMaterialfv
glMateriali
glMaterialiv
glPointSize
glPolygonMode
glPolygonStipple
glScissor
glShadeModel
glTexParameterf
glTexParameterfv
glTexParameteri
glTexParameteriv
glTexImage1D
glTexImage2D
glTexEnvf
glTexEnvfv
glTexEnvi
glTexEnviv
glTexGend
glTexGendv
glTexGenf
glTexGenfv
glTexGeni
glTexGeniv
glFeedbackBuffer
glSelectBuffer
glRenderMode
glInitNames
glLoadName
glPassThrough
glPopName
glPushName
glDrawBuffer
glClear
glClearAccum
glClearIndex
glClearColor
glClearStencil
glClearDepth
glStencilMask
glColorMask
glDepthMask
glIndexMask
glAccum
glDisable
glEnable
glFinish
glFlush
glPopAttrib
glPushAttrib
glMap1d
glMap1f
glMap2d
glMap2f
glMapGrid1d
glMapGrid1f
glMapGrid2d
glMapGrid2f
glEvalCoord1d
glEvalCoord1dv
glEvalCoord1f
glEvalCoord1fv
glEvalCoord2d
glEvalCoord2dv
glEvalCoord2f
glEvalCoord2fv
glEvalMesh1
glEvalPoint1
glEvalMesh2
glEvalPoint2
glAlphaFunc
glBlendFunc
glLogicOp
glStencilFunc
glStencilOp
glDepthFunc
glPixelZoom
glPixelTransferf
glPixelTransferi
glPixelStoref
glPixelStorei
glPixelMapfv
glPixelMapuiv
glPixelMapusv
glReadBuffer
glCopyPixels
glReadPixels
glDrawPixels
glGetBooleanv
glGetClipPlane
glGetDoublev
glGetError
glGetFloatv
glGetIntegerv
glGetLightfv
glGetLightiv
glGetMapdv
glGetMapfv
glGetMapiv
glGetMaterialfv
glGetMaterialiv
glGetPixelMapfv
glGetPixelMapuiv
glGetPixelMapusv
glGetPolygonStipple
glGetString
glGetTexEnvfv
glGetTexEnviv
glGetTexGendv
glGetTexGenfv
glGetTexGeniv
glGetTexImage
glGetTexParameterfv
glGetTexParameteriv
glGetTexLevelParameterfv
glGetTexLevelParameteriv
glIsEnabled
glIsList
glDepthRange
glFrustum
glLoadIdentity
glLoadMatrixf
glLoadMatrixd
glMatrixMode
glMultMatrixf
glMultMatrixd
glOrtho
glPopMatrix
glPushMatrix
glRotated
glRotatef
glScaled
glScalef
glTranslated
glTranslatef
glViewport
glArrayElement
glColorPointer
glDisableClientState
glDrawArrays
glDrawElements
glEdgeFlagPointer
glEnableClientState
glGetPointerv
glIndexPointer
glInterleavedArrays
glNormalPointer
glTexCoordPointer
glVertexPointer
glPolygonOffset
glCopyTexImage1D
glCopyTexImage2D
glCopyTexSubImage1D
glCopyTexSubImage2D
glTexSubImage1D
glTexSubImage2D
glAreTexturesResident
glBindTexture
glDeleteTextures
glGenTextures
glIsTexture
glPrioritizeTextures
glIndexub
glIndexubv
glPopClientAttrib
glPushClientAttrib
glBlendColor
glBlendEquation
glDrawRangeElements
glColorTable
glColorTableParameterfv
glColorTableParameteriv
glCopyColorTable
glGetColorTable
glGetColorTableParameterfv
glGetColorTableParameteriv
glColorSubTable
glCopyColorSubTable
glConvolutionFilter1D
glConvolutionFilter2D
glConvolutionParameterf
glConvolutionParameterfv
glConvolutionParameteri
glConvolutionParameteriv
glCopyConvolutionFilter1D
glCopyConvolutionFilter2D
glGetConvolutionFilter
glGetConvolutionParameterfv
glGetConvolutionParameteriv
glGetSeparableFilter
glSeparableFilter2D
glGetHistogram
glGetHistogramParameterfv
glGetHistogramParameteriv
glGetMinmax
glGetMinmaxParameterfv
glGetMinmaxParameteriv
glHistogram
glMinmax
glResetHistogram
glResetMinmax
glTexImage3D
glTexSubImage3D
glCopyTexSubImage3D
glActiveTextureARB
glClientActiveTextureARB
glMultiTexCoord1dARB
glMultiTexCoord1dvARB
glMultiTexCoord1fARB
glMultiTexCoord1fvARB
glMultiTexCoord1iARB
glMultiTexCoord1ivARB
glMultiTexCoord1sARB
glMultiTexCoord1svARB
glMultiTexCoord2dARB
glMultiTexCoord2dvARB
glMultiTexCoord2fARB
glMultiTexCoord2fvARB
glMultiTexCoord2iARB
glMultiTexCoord2ivARB
glMultiTexCoord2sARB
glMultiTexCoord2svARB
glMultiTexCoord3dARB
glMultiTexCoord3dvARB
glMultiTexCoord3fARB
glMultiTexCoord3fvARB
glMultiTexCoord3iARB
glMultiTexCoord3ivARB
glMultiTexCoord3sARB
glMultiTexCoord3svARB
glMultiTexCoord4dARB
glMultiTexCoord4dvARB
glMultiTexCoord4fARB
glMultiTexCoord4fvARB
glMultiTexCoord4iARB
glMultiTexCoord4ivARB
glMultiTexCoord4sARB
glMultiTexCoord4svARB
glLoadTransposeMatrixfARB
glLoadTransposeMatrixdARB
glMultTransposeMatrixfARB
glMultTransposeMatrixdARB
glSampleCoverageARB
glCompressedTexImage3DARB
glCompressedTexImage2DARB
glCompressedTexImage1DARB
glCompressedTexSubImage3DARB
glCompressedTexSubImage2DARB
glCompressedTexSubImage1DARB
glGetCompressedTexImageARB
glActiveTexture
glClientActiveTexture
glMultiTexCoord1d
glMultiTexCoord1dv
glMultiTexCoord1f
glMultiTexCoord1fv
glMultiTexCoord1i
glMultiTexCoord1iv
glMultiTexCoord1s
glMultiTexCoord1sv
glMultiTexCoord2d
glMultiTexCoord2dv
glMultiTexCoord2f
glMultiTexCoord2fv
glMultiTexCoord2i
glMultiTexCoord2iv
glMultiTexCoord2s
glMultiTexCoord2sv
glMultiTexCoord3d
glMultiTexCoord3dv
glMultiTexCoord3f
glMultiTexCoord3fv
glMultiTexCoord3i
glMultiTexCoord3iv
glMultiTexCoord3s
glMultiTexCoord3sv
glMultiTexCoord4d
glMultiTexCoord4dv
glMultiTexCoord4f
glMultiTexCoord4fv
glMultiTexCoord4i
glMultiTexCoord4iv
glMultiTexCoord4s
glMultiTexCoord4sv
glLoadTransposeMatrixf
glLoadTransposeMatrixd
glMultTransposeMatrixf
glMultTransposeMatrixd
glSampleCoverage
glCompressedTexImage3D
glCompressedTexImage2D
glCompressedTexImage1D
glCompressedTexSubImage3D
glCompressedTexSubImage2D
glCompressedTexSubImage1D
glGetCompressedTexImage
glBlendColorEXT
glPolygonOffsetEXT
glTexImage3DEXT
glTexSubImage3DEXT
glTexSubImage1DEXT
glTexSubImage2DEXT
glCopyTexImage1DEXT
glCopyTexImage2DEXT
glCopyTexSubImage1DEXT
glCopyTexSubImage2DEXT
glCopyTexSubImage3DEXT
glAreTexturesResidentEXT
glBindTextureEXT
glDeleteTexturesEXT
glGenTexturesEXT
glIsTextureEXT
glPrioritizeTexturesEXT
glArrayElementEXT
glColorPointerEXT
glDrawArraysEXT
glEdgeFlagPointerEXT
glGetPointervEXT
glIndexPointerEXT
glNormalPointerEXT
glTexCoordPointerEXT
glVertexPointerEXT
glBlendEquationEXT
glPointParameterfEXT
glPointParameterfvEXT
glPointParameterfARB
glPointParameterfvARB
glColorTableEXT
glGetColorTableEXT
glGetColorTableParameterivEXT
glGetColorTableParameterfvEXT
glLockArraysEXT
glUnlockArraysEXT
glDrawRangeElementsEXT
glSecondaryColor3bEXT
glSecondaryColor3bvEXT
glSecondaryColor3dEXT
glSecondaryColor3dvEXT
glSecondaryColor3fEXT
glSecondaryColor3fvEXT
glSecondaryColor3iEXT
glSecondaryColor3ivEXT
glSecondaryColor3sEXT
glSecondaryColor3svEXT
glSecondaryColor3ubEXT
glSecondaryColor3ubvEXT
glSecondaryColor3uiEXT
glSecondaryColor3uivEXT
glSecondaryColor3usEXT
glSecondaryColor3usvEXT
glSecondaryColorPointerEXT
glMultiDrawArraysEXT
glMultiDrawElementsEXT
glFogCoordfEXT
glFogCoordfvEXT
glFogCoorddEXT
glFogCoorddvEXT
glFogCoordPointerEXT
glBlendFuncSeparateEXT
glWindowPos2dMESA
glWindowPos2dvMESA
glWindowPos2fMESA
glWindowPos2fvMESA
glWindowPos2iMESA
glWindowPos2ivMESA
glWindowPos2sMESA
glWindowPos2svMESA
glWindowPos3dMESA
glWindowPos3dvMESA
glWindowPos3fMESA
glWindowPos3fvMESA
glWindowPos3iMESA
glWindowPos3ivMESA
glWindowPos3sMESA
glWindowPos3svMESA
glWindowPos4dMESA
glWindowPos4dvMESA
glWindowPos4fMESA
glWindowPos4fvMESA
glWindowPos4iMESA
glWindowPos4ivMESA
glWindowPos4sMESA
glWindowPos4svMESA
glWindowPos2dARB
glWindowPos2fARB
glWindowPos2iARB
glWindowPos2sARB
glWindowPos2dvARB
glWindowPos2fvARB
glWindowPos2ivARB
glWindowPos2svARB
glWindowPos3dARB
glWindowPos3fARB
glWindowPos3iARB
glWindowPos3sARB
glWindowPos3dvARB
glWindowPos3fvARB
glWindowPos3ivARB
glWindowPos3svARB
glAreProgramsResidentNV
glBindProgramNV
glDeleteProgramsNV
glExecuteProgramNV
glGenProgramsNV
glGetProgramParameterdvNV
glGetProgramParameterfvNV
glGetProgramivNV
glGetProgramStringNV
glGetTrackMatrixivNV
glGetVertexAttribdvNV
glGetVertexAttribfvNV
glGetVertexAttribivNV
glGetVertexAttribPointervNV
glIsProgramNV
glLoadProgramNV
glProgramParameter4dNV
glProgramParameter4dvNV
glProgramParameter4fNV
glProgramParameter4fvNV
glProgramParameters4dvNV
glProgramParameters4fvNV
glRequestResidentProgramsNV
glTrackMatrixNV
glVertexAttribPointerNV
glVertexAttrib1dNV
glVertexAttrib1dvNV
glVertexAttrib1fNV
glVertexAttrib1fvNV
glVertexAttrib1sNV
glVertexAttrib1svNV
glVertexAttrib2dNV
glVertexAttrib2dvNV
glVertexAttrib2fNV
glVertexAttrib2fvNV
glVertexAttrib2sNV
glVertexAttrib2svNV
glVertexAttrib3dNV
glVertexAttrib3dvNV
glVertexAttrib3fNV
glVertexAttrib3fvNV
glVertexAttrib3sNV
glVertexAttrib3svNV
glVertexAttrib4dNV
glVertexAttrib4dvNV
glVertexAttrib4fNV
glVertexAttrib4fvNV
glVertexAttrib4sNV
glVertexAttrib4svNV
glVertexAttrib4ubNV
glVertexAttrib4ubvNV
glVertexAttribs1dvNV
glVertexAttribs1fvNV
glVertexAttribs1svNV
glVertexAttribs2dvNV
glVertexAttribs2fvNV
glVertexAttribs2svNV
glVertexAttribs3dvNV
glVertexAttribs3fvNV
glVertexAttribs3svNV
glVertexAttribs4dvNV
glVertexAttribs4fvNV
glVertexAttribs4svNV
glVertexAttribs4ubvNV
glPointParameteriNV
glPointParameterivNV
glFogCoordf
glFogCoordfv
glFogCoordd
glFogCoorddv
glFogCoordPointer
glMultiDrawArrays
glMultiDrawElements
glPointParameterf
glPointParameterfv
glPointParameteri
glPointParameteriv
glSecondaryColor3b
glSecondaryColor3bv
glSecondaryColor3d
glSecondaryColor3dv
glSecondaryColor3f
glSecondaryColor3fv
glSecondaryColor3i
glSecondaryColor3iv
glSecondaryColor3s
glSecondaryColor3sv
glSecondaryColor3ub
glSecondaryColor3ubv
glSecondaryColor3ui
glSecondaryColor3uiv
glSecondaryColor3us
glSecondaryColor3usv
glSecondaryColorPointer
glWindowPos2d
glWindowPos2dv
glWindowPos2f
glWindowPos2fv
glWindowPos2i
glWindowPos2iv
glWindowPos2s
glWindowPos2sv
glWindowPos3d
glWindowPos3dv
glWindowPos3f
glWindowPos3fv
glWindowPos3i
glWindowPos3iv
glWindowPos3s
glWindowPos3sv
glVertexAttrib1sARB
glVertexAttrib1fARB
glVertexAttrib1dARB
glVertexAttrib2sARB
glVertexAttrib2fARB
glVertexAttrib2dARB
glVertexAttrib3sARB
glVertexAttrib3fARB
glVertexAttrib3dARB
glVertexAttrib4sARB
glVertexAttrib4fARB
glVertexAttrib4dARB
glVertexAttrib4NubARB
glVertexAttrib1svARB
glVertexAttrib1fvARB
glVertexAttrib1dvARB
glVertexAttrib2svARB
glVertexAttrib2fvARB
glVertexAttrib2dvARB
glVertexAttrib3svARB
glVertexAttrib3fvARB
glVertexAttrib3dvARB
glVertexAttrib4bvARB
glVertexAttrib4svARB
glVertexAttrib4ivARB
glVertexAttrib4ubvARB
glVertexAttrib4usvARB
glVertexAttrib4uivARB
glVertexAttrib4fvARB
glVertexAttrib4dvARB
glVertexAttrib4NbvARB
glVertexAttrib4NsvARB
glVertexAttrib4NivARB
glVertexAttrib4NubvARB
glVertexAttrib4NusvARB
glVertexAttrib4NuivARB
glVertexAttribPointerARB
glEnableVertexAttribArrayARB
glDisableVertexAttribArrayARB
glProgramStringARB
glBindProgramARB
glDeleteProgramsARB
glGenProgramsARB
glIsProgramARB
glProgramEnvParameter4dARB
glProgramEnvParameter4dvARB
glProgramEnvParameter4fARB
glProgramEnvParameter4fvARB
glProgramLocalParameter4dARB
glProgramLocalParameter4dvARB
glProgramLocalParameter4fARB
glProgramLocalParameter4fvARB
glGetProgramEnvParameterdvARB
glGetProgramEnvParameterfvARB
glGetProgramLocalParameterdvARB
glGetProgramLocalParameterfvARB
glGetProgramivARB
glGetProgramStringARB
glGetVertexAttribdvARB
glGetVertexAttribfvARB
glGetVertexAttribivARB
glGetVertexAttribPointervARB
glProgramNamedParameter4fNV
glProgramNamedParameter4dNV
glProgramNamedParameter4fvNV
glProgramNamedParameter4dvNV
glGetProgramNamedParameterfvNV
glGetProgramNamedParameterdvNV
glBindBufferARB
glBufferDataARB
glBufferSubDataARB
glDeleteBuffersARB
glGenBuffersARB
glGetBufferParameterivARB
glGetBufferPointervARB
glGetBufferSubDataARB
glIsBufferARB
glMapBufferARB
glUnmapBufferARB
glGenQueriesARB
glDeleteQueriesARB
glIsQueryARB
glBeginQueryARB
glEndQueryARB
glGetQueryivARB
glGetQueryObjectivARB
glGetQueryObjectuivARB
glBindBuffer
glBufferData
glBufferSubData
glDeleteBuffers
glGenBuffers
glGetBufferParameteriv
glGetBufferPointerv
glGetBufferSubData
glIsBuffer
glMapBuffer
glUnmapBuffer
glGenQueries
glDeleteQueries
glIsQuery
glBeginQuery
glEndQuery
glGetQueryiv
glGetQueryObjectiv
glGetQueryObjectuiv
;
; WGL API
wglChoosePixelFormat
wglCopyContext
wglCreateContext
wglCreateLayerContext
wglDeleteContext
wglDescribeLayerPlane
wglDescribePixelFormat
wglGetCurrentContext
wglGetCurrentDC
wglGetLayerPaletteEntries
wglGetPixelFormat
wglGetProcAddress
wglMakeCurrent
wglRealizeLayerPalette
wglSetLayerPaletteEntries
wglSetPixelFormat
wglShareLists
wglSwapBuffers
wglSwapLayerBuffers
wglUseFontBitmapsA
wglUseFontBitmapsW
wglUseFontOutlinesA
wglUseFontOutlinesW
wglGetExtensionsStringARB
/contrib/sdk/sources/Mesa/src/mesa/drivers/windows/gdi/wgl.c
0,0 → 1,689
 
/*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
 
/*
* File name : wgl.c
* WGL stuff. Added by Oleg Letsinsky, ajl@ultersys.ru
* Some things originated from the 3Dfx WGL functions
*/
 
/*
* This file contains the implementation of the wgl* functions for
* Mesa on Windows. Since these functions are provided by Windows in
* GDI/OpenGL, we must supply our versions that work with Mesa here.
*/
 
 
#include <windows.h>
 
#include "main/config.h"
#include "glapi/glapi.h"
#include "swrast/swrast.h"
#include "GL/wmesa.h" /* protos for wmesa* functions */
 
/*
* Pixel Format Descriptors
*/
 
/* Extend the PFD to include DB flag */
struct __pixelformat__
{
PIXELFORMATDESCRIPTOR pfd;
GLboolean doubleBuffered;
};
 
 
 
/* These are the PFD's supported by this driver. */
struct __pixelformat__ pfd[] =
{
#if 0
/* Double Buffer, alpha */
{
{
sizeof(PIXELFORMATDESCRIPTOR), 1,
PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|
PFD_GENERIC_FORMAT|PFD_DOUBLEBUFFER|PFD_SWAP_COPY,
PFD_TYPE_RGBA,
24,
8, 0,
8, 8,
8, 16,
8, 24,
0, 0, 0, 0, 0,
DEFAULT_SOFTWARE_DEPTH_BITS, 8,
0, 0, 0,
0, 0, 0
},
GL_TRUE
},
/* Single Buffer, alpha */
{
{
sizeof(PIXELFORMATDESCRIPTOR), 1,
PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|
PFD_GENERIC_FORMAT,
PFD_TYPE_RGBA,
24,
8, 0,
8, 8,
8, 16,
8, 24,
0, 0, 0, 0, 0,
DEFAULT_SOFTWARE_DEPTH_BITS, 8,
0, 0, 0,
0, 0, 0
},
GL_FALSE
},
#endif
/* Double Buffer, no alpha */
{
{
sizeof(PIXELFORMATDESCRIPTOR), 1,
PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|
PFD_GENERIC_FORMAT|PFD_DOUBLEBUFFER|PFD_SWAP_COPY,
PFD_TYPE_RGBA,
24,
8, 0,
8, 8,
8, 16,
0, 0,
0, 0, 0, 0, 0,
DEFAULT_SOFTWARE_DEPTH_BITS, 8,
0, 0, 0,
0, 0, 0
},
GL_TRUE
},
/* Single Buffer, no alpha */
{
{
sizeof(PIXELFORMATDESCRIPTOR), 1,
PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|
PFD_GENERIC_FORMAT,
PFD_TYPE_RGBA,
24,
8, 0,
8, 8,
8, 16,
0, 0,
0, 0, 0, 0, 0,
DEFAULT_SOFTWARE_DEPTH_BITS, 8,
0, 0, 0,
0, 0, 0
},
GL_FALSE
},
};
 
int npfd = sizeof(pfd) / sizeof(pfd[0]);
 
 
/*
* Contexts
*/
 
typedef struct {
WMesaContext ctx;
} MesaWglCtx;
 
#define MESAWGL_CTX_MAX_COUNT 20
 
static MesaWglCtx wgl_ctx[MESAWGL_CTX_MAX_COUNT];
 
static unsigned ctx_count = 0;
static int ctx_current = -1;
static unsigned curPFD = 0;
 
static HDC CurrentHDC = 0;
 
 
WINGDIAPI HGLRC GLAPIENTRY wglCreateContext(HDC hdc)
{
int i = 0;
if (!ctx_count) {
for(i=0;i<MESAWGL_CTX_MAX_COUNT;i++) {
wgl_ctx[i].ctx = NULL;
}
}
for( i = 0; i < MESAWGL_CTX_MAX_COUNT; i++ ) {
if ( wgl_ctx[i].ctx == NULL ) {
wgl_ctx[i].ctx =
WMesaCreateContext(hdc, NULL, (GLboolean)GL_TRUE,
(GLboolean) (pfd[curPFD-1].doubleBuffered ?
GL_TRUE : GL_FALSE),
(GLboolean)(pfd[curPFD-1].pfd.cAlphaBits ?
GL_TRUE : GL_FALSE) );
if (wgl_ctx[i].ctx == NULL)
break;
ctx_count++;
return ((HGLRC)wgl_ctx[i].ctx);
}
}
SetLastError(0);
return(NULL);
}
 
WINGDIAPI BOOL GLAPIENTRY wglDeleteContext(HGLRC hglrc)
{
int i;
for ( i = 0; i < MESAWGL_CTX_MAX_COUNT; i++ ) {
if ( wgl_ctx[i].ctx == (WMesaContext) hglrc ){
WMesaMakeCurrent((WMesaContext) hglrc, NULL);
WMesaDestroyContext(wgl_ctx[i].ctx);
wgl_ctx[i].ctx = NULL;
ctx_count--;
return(TRUE);
}
}
SetLastError(0);
return(FALSE);
}
 
WINGDIAPI HGLRC GLAPIENTRY wglGetCurrentContext(VOID)
{
if (ctx_current < 0)
return 0;
else
return (HGLRC) wgl_ctx[ctx_current].ctx;
}
 
WINGDIAPI HDC GLAPIENTRY wglGetCurrentDC(VOID)
{
return CurrentHDC;
}
 
WINGDIAPI BOOL GLAPIENTRY wglMakeCurrent(HDC hdc, HGLRC hglrc)
{
int i;
CurrentHDC = hdc;
 
if (!hdc || !hglrc) {
WMesaMakeCurrent(NULL, NULL);
ctx_current = -1;
return TRUE;
}
for ( i = 0; i < MESAWGL_CTX_MAX_COUNT; i++ ) {
if ( wgl_ctx[i].ctx == (WMesaContext) hglrc ) {
WMesaMakeCurrent( (WMesaContext) hglrc, hdc );
ctx_current = i;
return TRUE;
}
}
return FALSE;
}
 
 
WINGDIAPI int GLAPIENTRY wglChoosePixelFormat(HDC hdc,
CONST
PIXELFORMATDESCRIPTOR *ppfd)
{
int i,best = -1,bestdelta = 0x7FFFFFFF,delta;
(void) hdc;
if(ppfd->nSize != sizeof(PIXELFORMATDESCRIPTOR) || ppfd->nVersion != 1)
{
SetLastError(0);
return(0);
}
for(i = 0; i < npfd;i++)
{
delta = 0;
if(
(ppfd->dwFlags & PFD_DRAW_TO_WINDOW) &&
!(pfd[i].pfd.dwFlags & PFD_DRAW_TO_WINDOW))
continue;
if(
(ppfd->dwFlags & PFD_DRAW_TO_BITMAP) &&
!(pfd[i].pfd.dwFlags & PFD_DRAW_TO_BITMAP))
continue;
if(
(ppfd->dwFlags & PFD_SUPPORT_GDI) &&
!(pfd[i].pfd.dwFlags & PFD_SUPPORT_GDI))
continue;
if(
(ppfd->dwFlags & PFD_SUPPORT_OPENGL) &&
!(pfd[i].pfd.dwFlags & PFD_SUPPORT_OPENGL))
continue;
if(
!(ppfd->dwFlags & PFD_DOUBLEBUFFER_DONTCARE) &&
((ppfd->dwFlags & PFD_DOUBLEBUFFER) !=
(pfd[i].pfd.dwFlags & PFD_DOUBLEBUFFER)))
continue;
if(
!(ppfd->dwFlags & PFD_STEREO_DONTCARE) &&
((ppfd->dwFlags & PFD_STEREO) !=
(pfd[i].pfd.dwFlags & PFD_STEREO)))
continue;
if(ppfd->iPixelType != pfd[i].pfd.iPixelType)
delta++;
if(ppfd->cAlphaBits != pfd[i].pfd.cAlphaBits)
delta++;
if(delta < bestdelta)
{
best = i + 1;
bestdelta = delta;
if(bestdelta == 0)
break;
}
}
if(best == -1)
{
SetLastError(0);
return(0);
}
return(best);
}
 
WINGDIAPI int GLAPIENTRY wglDescribePixelFormat(HDC hdc,
int iPixelFormat,
UINT nBytes,
LPPIXELFORMATDESCRIPTOR ppfd)
{
(void) hdc;
if(ppfd == NULL)
return(npfd);
if(iPixelFormat < 1 || iPixelFormat > npfd ||
nBytes != sizeof(PIXELFORMATDESCRIPTOR))
{
SetLastError(0);
return(0);
}
*ppfd = pfd[iPixelFormat - 1].pfd;
return(npfd);
}
 
WINGDIAPI PROC GLAPIENTRY wglGetProcAddress(LPCSTR lpszProc)
{
PROC p = (PROC) _glapi_get_proc_address((const char *) lpszProc);
if (p)
return p;
SetLastError(0);
return(NULL);
}
 
WINGDIAPI int GLAPIENTRY wglGetPixelFormat(HDC hdc)
{
(void) hdc;
if(curPFD == 0) {
SetLastError(0);
return(0);
}
return(curPFD);
}
 
WINGDIAPI BOOL GLAPIENTRY wglSetPixelFormat(HDC hdc,int iPixelFormat,
const PIXELFORMATDESCRIPTOR *ppfd)
{
(void) hdc;
 
/* SetPixelFormat (hence wglSetPixelFormat) must not touch ppfd, per
* http://msdn.microsoft.com/en-us/library/dd369049(v=vs.85).aspx
*/
(void) ppfd;
 
if(iPixelFormat < 1 || iPixelFormat > npfd) {
SetLastError(0);
return(FALSE);
}
curPFD = iPixelFormat;
return(TRUE);
}
 
WINGDIAPI BOOL GLAPIENTRY wglSwapBuffers(HDC hdc)
{
WMesaSwapBuffers(hdc);
return TRUE;
}
 
static FIXED FixedFromDouble(double d)
{
long l = (long) (d * 65536L);
return *(FIXED *) (void *) &l;
}
 
 
/*
** This is cribbed from FX/fxwgl.c, and seems to implement support
** for bitmap fonts where the wglUseFontBitmapsA() code implements
** support for outline fonts. In combination they hopefully give
** fairly generic support for fonts.
*/
static BOOL wglUseFontBitmaps_FX(HDC fontDevice, DWORD firstChar,
DWORD numChars, DWORD listBase)
{
#define VERIFY(a) (void)(a)
TEXTMETRIC metric;
BITMAPINFO *dibInfo;
HDC bitDevice;
COLORREF tempColor;
int i;
VERIFY(GetTextMetrics(fontDevice, &metric));
dibInfo = calloc(sizeof(BITMAPINFO) + sizeof(RGBQUAD), 1);
dibInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
dibInfo->bmiHeader.biPlanes = 1;
dibInfo->bmiHeader.biBitCount = 1;
dibInfo->bmiHeader.biCompression = BI_RGB;
bitDevice = CreateCompatibleDC(fontDevice);
/* Swap fore and back colors so the bitmap has the right polarity */
tempColor = GetBkColor(bitDevice);
SetBkColor(bitDevice, GetTextColor(bitDevice));
SetTextColor(bitDevice, tempColor);
/* Place chars based on base line */
VERIFY(SetTextAlign(bitDevice, TA_BASELINE) != GDI_ERROR ? 1 : 0);
for(i = 0; i < (int)numChars; i++) {
SIZE size;
char curChar;
int charWidth,charHeight,bmapWidth,bmapHeight,numBytes,res;
HBITMAP bitObject;
HGDIOBJ origBmap;
unsigned char *bmap;
curChar = (char)(i + firstChar);
/* Find how high/wide this character is */
VERIFY(GetTextExtentPoint32(bitDevice, &curChar, 1, &size));
/* Create the output bitmap */
charWidth = size.cx;
charHeight = size.cy;
/* Round up to the next multiple of 32 bits */
bmapWidth = ((charWidth + 31) / 32) * 32;
bmapHeight = charHeight;
bitObject = CreateCompatibleBitmap(bitDevice,
bmapWidth,
bmapHeight);
/* VERIFY(bitObject); */
/* Assign the output bitmap to the device */
origBmap = SelectObject(bitDevice, bitObject);
(void) VERIFY(origBmap);
VERIFY( PatBlt( bitDevice, 0, 0, bmapWidth, bmapHeight,BLACKNESS ) );
/* Use our source font on the device */
VERIFY(SelectObject(bitDevice, GetCurrentObject(fontDevice,OBJ_FONT)));
/* Draw the character */
VERIFY(TextOut(bitDevice, 0, metric.tmAscent, &curChar, 1));
/* Unselect our bmap object */
VERIFY(SelectObject(bitDevice, origBmap));
/* Convert the display dependant representation to a 1 bit deep DIB */
numBytes = (bmapWidth * bmapHeight) / 8;
bmap = malloc(numBytes);
dibInfo->bmiHeader.biWidth = bmapWidth;
dibInfo->bmiHeader.biHeight = bmapHeight;
res = GetDIBits(bitDevice, bitObject, 0, bmapHeight, bmap,
dibInfo,
DIB_RGB_COLORS);
/* VERIFY(res); */
/* Create the GL object */
glNewList(i + listBase, GL_COMPILE);
glBitmap(bmapWidth, bmapHeight, 0.0, (GLfloat)metric.tmDescent,
(GLfloat)charWidth, 0.0,
bmap);
glEndList();
/* CheckGL(); */
/* Destroy the bmap object */
DeleteObject(bitObject);
/* Deallocate the bitmap data */
free(bmap);
}
/* Destroy the DC */
VERIFY(DeleteDC(bitDevice));
free(dibInfo);
return TRUE;
#undef VERIFY
}
 
WINGDIAPI BOOL GLAPIENTRY wglUseFontBitmapsA(HDC hdc, DWORD first,
DWORD count, DWORD listBase)
{
int i;
GLuint font_list;
DWORD size;
GLYPHMETRICS gm;
HANDLE hBits;
LPSTR lpBits;
MAT2 mat;
int success = TRUE;
if (count == 0)
return FALSE;
font_list = listBase;
mat.eM11 = FixedFromDouble(1);
mat.eM12 = FixedFromDouble(0);
mat.eM21 = FixedFromDouble(0);
mat.eM22 = FixedFromDouble(-1);
memset(&gm,0,sizeof(gm));
/*
** If we can't get the glyph outline, it may be because this is a fixed
** font. Try processing it that way.
*/
if( GetGlyphOutline(hdc, first, GGO_BITMAP, &gm, 0, NULL, &mat)
== GDI_ERROR ) {
return wglUseFontBitmaps_FX( hdc, first, count, listBase );
}
/*
** Otherwise process all desired characters.
*/
for (i = 0; i < (int)count; i++) {
DWORD err;
glNewList( font_list+i, GL_COMPILE );
/* allocate space for the bitmap/outline */
size = GetGlyphOutline(hdc, first + i, GGO_BITMAP,
&gm, 0, NULL, &mat);
if (size == GDI_ERROR) {
glEndList( );
err = GetLastError();
success = FALSE;
continue;
}
hBits = GlobalAlloc(GHND, size+1);
lpBits = GlobalLock(hBits);
err =
GetGlyphOutline(hdc, /* handle to device context */
first + i, /* character to query */
GGO_BITMAP, /* format of data to return */
&gm, /* ptr to structure for metrics*/
size, /* size of buffer for data */
lpBits, /* pointer to buffer for data */
&mat /* pointer to transformation */
/* matrix structure */
);
if (err == GDI_ERROR) {
GlobalUnlock(hBits);
GlobalFree(hBits);
glEndList( );
err = GetLastError();
success = FALSE;
continue;
}
glBitmap(gm.gmBlackBoxX,gm.gmBlackBoxY,
(GLfloat)-gm.gmptGlyphOrigin.x,
(GLfloat)gm.gmptGlyphOrigin.y,
(GLfloat)gm.gmCellIncX,
(GLfloat)gm.gmCellIncY,
(const GLubyte * )lpBits);
GlobalUnlock(hBits);
GlobalFree(hBits);
glEndList( );
}
return success;
}
 
WINGDIAPI BOOL GLAPIENTRY wglShareLists(HGLRC hglrc1,
HGLRC hglrc2)
{
WMesaShareLists((WMesaContext)hglrc1, (WMesaContext)hglrc2);
return(TRUE);
}
 
 
 
/* NOT IMPLEMENTED YET */
WINGDIAPI BOOL GLAPIENTRY wglCopyContext(HGLRC hglrcSrc,
HGLRC hglrcDst,
UINT mask)
{
(void) hglrcSrc; (void) hglrcDst; (void) mask;
return(FALSE);
}
 
WINGDIAPI HGLRC GLAPIENTRY wglCreateLayerContext(HDC hdc,
int iLayerPlane)
{
SetLastError(0);
if (iLayerPlane == 0)
return wglCreateContext( hdc );
return(NULL);
}
 
 
WINGDIAPI BOOL GLAPIENTRY wglUseFontBitmapsW(HDC hdc,
DWORD first,
DWORD count,
DWORD listBase)
{
(void) hdc; (void) first; (void) count; (void) listBase;
return FALSE;
}
 
WINGDIAPI BOOL GLAPIENTRY wglUseFontOutlinesA(HDC hdc,
DWORD first,
DWORD count,
DWORD listBase,
FLOAT deviation,
FLOAT extrusion,
int format,
LPGLYPHMETRICSFLOAT lpgmf)
{
(void) hdc; (void) first; (void) count;
(void) listBase; (void) deviation; (void) extrusion; (void) format;
(void) lpgmf;
SetLastError(0);
return(FALSE);
}
 
WINGDIAPI BOOL GLAPIENTRY wglUseFontOutlinesW(HDC hdc,
DWORD first,
DWORD count,
DWORD listBase,
FLOAT deviation,
FLOAT extrusion,
int format,
LPGLYPHMETRICSFLOAT lpgmf)
{
(void) hdc; (void) first; (void) count;
(void) listBase; (void) deviation; (void) extrusion; (void) format;
(void) lpgmf;
SetLastError(0);
return(FALSE);
}
 
WINGDIAPI BOOL GLAPIENTRY wglDescribeLayerPlane(HDC hdc,
int iPixelFormat,
int iLayerPlane,
UINT nBytes,
LPLAYERPLANEDESCRIPTOR plpd)
{
(void) hdc; (void) iPixelFormat; (void) iLayerPlane;
(void) nBytes; (void) plpd;
SetLastError(0);
return(FALSE);
}
 
WINGDIAPI int GLAPIENTRY wglSetLayerPaletteEntries(HDC hdc,
int iLayerPlane,
int iStart,
int cEntries,
CONST COLORREF *pcr)
{
(void) hdc; (void) iLayerPlane; (void) iStart;
(void) cEntries; (void) pcr;
SetLastError(0);
return(0);
}
 
WINGDIAPI int GLAPIENTRY wglGetLayerPaletteEntries(HDC hdc,
int iLayerPlane,
int iStart,
int cEntries,
COLORREF *pcr)
{
(void) hdc; (void) iLayerPlane; (void) iStart; (void) cEntries; (void) pcr;
SetLastError(0);
return(0);
}
 
WINGDIAPI BOOL GLAPIENTRY wglRealizeLayerPalette(HDC hdc,
int iLayerPlane,
BOOL bRealize)
{
(void) hdc; (void) iLayerPlane; (void) bRealize;
SetLastError(0);
return(FALSE);
}
 
WINGDIAPI BOOL GLAPIENTRY wglSwapLayerBuffers(HDC hdc,
UINT fuPlanes)
{
(void) hdc; (void) fuPlanes;
SetLastError(0);
return(FALSE);
}
 
WINGDIAPI const char * GLAPIENTRY wglGetExtensionsStringARB(HDC hdc)
{
return "WGL_ARB_extensions_string";
}
/contrib/sdk/sources/Mesa/src/mesa/drivers/windows/gdi/wmesa.c
0,0 → 1,793
/*
* Windows (Win32/Win64) device driver for Mesa
*
*/
 
#include "wmesadef.h"
#include "colors.h"
#include "GL/wmesa.h"
#include <winuser.h>
#include "main/context.h"
#include "main/api_exec.h"
#include "main/extensions.h"
#include "main/framebuffer.h"
#include "main/renderbuffer.h"
#include "main/macros.h"
#include "main/version.h"
#include "main/vtxfmt.h"
#include "drivers/common/driverfuncs.h"
#include "drivers/common/meta.h"
#include "vbo/vbo.h"
#include "swrast/swrast.h"
#include "swrast/s_renderbuffer.h"
#include "swrast_setup/swrast_setup.h"
#include "tnl/tnl.h"
#include "tnl/t_context.h"
#include "tnl/t_pipeline.h"
 
 
/* linked list of our Framebuffers (windows) */
static WMesaFramebuffer FirstFramebuffer = NULL;
 
 
/**
* Create a new WMesaFramebuffer object which will correspond to the
* given HDC (Window handle).
*/
static WMesaFramebuffer
wmesa_new_framebuffer(HDC hdc, struct gl_config *visual)
{
WMesaFramebuffer pwfb
= malloc(sizeof(struct wmesa_framebuffer));
if (pwfb) {
_mesa_initialize_window_framebuffer(&pwfb->Base, visual);
pwfb->hDC = hdc;
/* insert at head of list */
pwfb->next = FirstFramebuffer;
FirstFramebuffer = pwfb;
}
return pwfb;
}
 
/**
* Given an hdc, free the corresponding WMesaFramebuffer
*/
static void
wmesa_free_framebuffer(HDC hdc)
{
WMesaFramebuffer pwfb, prev;
for (pwfb = FirstFramebuffer; pwfb; pwfb = pwfb->next) {
if (pwfb->hDC == hdc)
break;
prev = pwfb;
}
if (pwfb) {
struct gl_framebuffer *fb;
if (pwfb == FirstFramebuffer)
FirstFramebuffer = pwfb->next;
else
prev->next = pwfb->next;
fb = &pwfb->Base;
_mesa_reference_framebuffer(&fb, NULL);
}
}
 
/**
* Given an hdc, return the corresponding WMesaFramebuffer
*/
static WMesaFramebuffer
wmesa_lookup_framebuffer(HDC hdc)
{
WMesaFramebuffer pwfb;
for (pwfb = FirstFramebuffer; pwfb; pwfb = pwfb->next) {
if (pwfb->hDC == hdc)
return pwfb;
}
return NULL;
}
 
 
/**
* Given a struct gl_framebuffer, return the corresponding WMesaFramebuffer.
*/
static WMesaFramebuffer wmesa_framebuffer(struct gl_framebuffer *fb)
{
return (WMesaFramebuffer) fb;
}
 
 
/**
* Given a struct gl_context, return the corresponding WMesaContext.
*/
static WMesaContext wmesa_context(const struct gl_context *ctx)
{
return (WMesaContext) ctx;
}
 
 
/*
* Every driver should implement a GetString function in order to
* return a meaningful GL_RENDERER string.
*/
static const GLubyte *wmesa_get_string(struct gl_context *ctx, GLenum name)
{
return (name == GL_RENDERER) ?
(GLubyte *) "Mesa Windows GDI Driver" : NULL;
}
 
 
/*
* Determine the pixel format based on the pixel size.
*/
static void wmSetPixelFormat(WMesaFramebuffer pwfb, HDC hDC)
{
pwfb->cColorBits = GetDeviceCaps(hDC, BITSPIXEL);
 
/* Only 16 and 32 bit targets are supported now */
assert(pwfb->cColorBits == 0 ||
pwfb->cColorBits == 16 ||
pwfb->cColorBits == 24 ||
pwfb->cColorBits == 32);
 
switch(pwfb->cColorBits){
case 8:
pwfb->pixelformat = PF_INDEX8;
break;
case 16:
pwfb->pixelformat = PF_5R6G5B;
break;
case 24:
case 32:
pwfb->pixelformat = PF_8R8G8B;
break;
default:
pwfb->pixelformat = PF_BADFORMAT;
}
}
 
 
/**
* Create DIB for back buffer.
* We write into this memory with the span routines and then blit it
* to the window on a buffer swap.
*/
static BOOL wmCreateBackingStore(WMesaFramebuffer pwfb, long lxSize, long lySize)
{
LPBITMAPINFO pbmi = &(pwfb->bmi);
HDC hic;
 
pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth = lxSize;
pbmi->bmiHeader.biHeight= -lySize;
pbmi->bmiHeader.biPlanes = 1;
pbmi->bmiHeader.biBitCount = GetDeviceCaps(pwfb->hDC, BITSPIXEL);
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;
pwfb->cColorBits = pbmi->bmiHeader.biBitCount;
pwfb->ScanWidth = (lxSize * (pwfb->cColorBits / 8) + 3) & ~3;
hic = CreateIC("display", NULL, NULL, NULL);
pwfb->dib_hDC = CreateCompatibleDC(hic);
pwfb->hbmDIB = CreateDIBSection(hic,
&pwfb->bmi,
DIB_RGB_COLORS,
(void **)&(pwfb->pbPixels),
0,
0);
pwfb->hOldBitmap = SelectObject(pwfb->dib_hDC, pwfb->hbmDIB);
DeleteDC(hic);
 
wmSetPixelFormat(pwfb, pwfb->hDC);
return TRUE;
}
 
 
static void wmDeleteBackingStore(WMesaFramebuffer pwfb)
{
if (pwfb->hbmDIB) {
SelectObject(pwfb->dib_hDC, pwfb->hOldBitmap);
DeleteDC(pwfb->dib_hDC);
DeleteObject(pwfb->hbmDIB);
}
}
 
 
/**
* Find the width and height of the window named by hdc.
*/
static void
get_window_size(HDC hdc, GLuint *width, GLuint *height)
{
if (WindowFromDC(hdc)) {
RECT rect;
GetClientRect(WindowFromDC(hdc), &rect);
*width = rect.right - rect.left;
*height = rect.bottom - rect.top;
}
else { /* Memory context */
/* From contributed code - use the size of the desktop
* for the size of a memory context (?) */
*width = GetDeviceCaps(hdc, HORZRES);
*height = GetDeviceCaps(hdc, VERTRES);
}
}
 
 
static void
wmesa_get_buffer_size(struct gl_framebuffer *buffer, GLuint *width, GLuint *height)
{
WMesaFramebuffer pwfb = wmesa_framebuffer(buffer);
get_window_size(pwfb->hDC, width, height);
}
 
 
static void wmesa_flush(struct gl_context *ctx)
{
WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->WinSysDrawBuffer);
 
if (ctx->Visual.doubleBufferMode == 1) {
BitBlt(pwfb->hDC, 0, 0, pwfb->Base.Width, pwfb->Base.Height,
pwfb->dib_hDC, 0, 0, SRCCOPY);
}
else {
/* Do nothing for single buffer */
}
}
 
 
/**********************************************************************/
/***** CLEAR Functions *****/
/**********************************************************************/
 
/*
* Clear the color/depth/stencil buffers.
*/
static void clear(struct gl_context *ctx, GLbitfield mask)
{
#define FLIP(Y) (ctx->DrawBuffer->Height - (Y) - 1)
const GLint x = ctx->DrawBuffer->_Xmin;
const GLint y = ctx->DrawBuffer->_Ymin;
const GLint height = ctx->DrawBuffer->_Ymax - ctx->DrawBuffer->_Ymin;
const GLint width = ctx->DrawBuffer->_Xmax - ctx->DrawBuffer->_Xmin;
 
WMesaContext pwc = wmesa_context(ctx);
WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
int done = 0;
 
/* Let swrast do all the work if the masks are not set to
* clear all channels. */
if (!ctx->Color.ColorMask[0][0] ||
!ctx->Color.ColorMask[0][1] ||
!ctx->Color.ColorMask[0][2] ||
!ctx->Color.ColorMask[0][3]) {
_swrast_Clear(ctx, mask);
return;
}
 
if (mask & BUFFER_BITS_COLOR) {
/* setup the clearing color */
const union gl_color_union color = ctx->Color.ClearColor;
GLubyte col[3];
UNCLAMPED_FLOAT_TO_UBYTE(col[0], color.f[0]);
UNCLAMPED_FLOAT_TO_UBYTE(col[1], color.f[1]);
UNCLAMPED_FLOAT_TO_UBYTE(col[2], color.f[2]);
pwc->clearColorRef = RGB(col[0], col[1], col[2]);
DeleteObject(pwc->clearPen);
DeleteObject(pwc->clearBrush);
pwc->clearPen = CreatePen(PS_SOLID, 1, pwc->clearColorRef);
pwc->clearBrush = CreateSolidBrush(pwc->clearColorRef);
}
 
/* Back buffer */
if (mask & BUFFER_BIT_BACK_LEFT) {
int i, rowSize;
UINT bytesPerPixel = pwfb->cColorBits / 8;
LPBYTE lpb, clearRow;
LPWORD lpw;
BYTE bColor;
WORD wColor;
BYTE r, g, b;
DWORD dwColor;
LPDWORD lpdw;
/* Try for a fast clear - clearing entire buffer with a single
* byte value. */
if (width == ctx->DrawBuffer->Width &&
height == ctx->DrawBuffer->Height) { /* entire buffer */
/* Now check for an easy clear value */
switch (bytesPerPixel) {
case 1:
bColor = BGR8(GetRValue(pwc->clearColorRef),
GetGValue(pwc->clearColorRef),
GetBValue(pwc->clearColorRef));
memset(pwfb->pbPixels, bColor,
pwfb->ScanWidth * height);
done = 1;
break;
case 2:
wColor = BGR16(GetRValue(pwc->clearColorRef),
GetGValue(pwc->clearColorRef),
GetBValue(pwc->clearColorRef));
if (((wColor >> 8) & 0xff) == (wColor & 0xff)) {
memset(pwfb->pbPixels, wColor & 0xff,
pwfb->ScanWidth * height);
done = 1;
}
break;
case 3:
/* fall through */
case 4:
if (GetRValue(pwc->clearColorRef) ==
GetGValue(pwc->clearColorRef) &&
GetRValue(pwc->clearColorRef) ==
GetBValue(pwc->clearColorRef)) {
memset(pwfb->pbPixels,
GetRValue(pwc->clearColorRef),
pwfb->ScanWidth * height);
done = 1;
}
break;
default:
break;
}
} /* all */
 
if (!done) {
/* Need to clear a row at a time. Begin by setting the first
* row in the area to be cleared to the clear color. */
clearRow = pwfb->pbPixels +
pwfb->ScanWidth * FLIP(y) +
bytesPerPixel * x;
switch (bytesPerPixel) {
case 1:
lpb = clearRow;
bColor = BGR8(GetRValue(pwc->clearColorRef),
GetGValue(pwc->clearColorRef),
GetBValue(pwc->clearColorRef));
memset(lpb, bColor, width);
break;
case 2:
lpw = (LPWORD)clearRow;
wColor = BGR16(GetRValue(pwc->clearColorRef),
GetGValue(pwc->clearColorRef),
GetBValue(pwc->clearColorRef));
for (i=0; i<width; i++)
*lpw++ = wColor;
break;
case 3:
lpb = clearRow;
r = GetRValue(pwc->clearColorRef);
g = GetGValue(pwc->clearColorRef);
b = GetBValue(pwc->clearColorRef);
for (i=0; i<width; i++) {
*lpb++ = b;
*lpb++ = g;
*lpb++ = r;
}
break;
case 4:
lpdw = (LPDWORD)clearRow;
dwColor = BGR32(GetRValue(pwc->clearColorRef),
GetGValue(pwc->clearColorRef),
GetBValue(pwc->clearColorRef));
for (i=0; i<width; i++)
*lpdw++ = dwColor;
break;
default:
break;
} /* switch */
/* copy cleared row to other rows in buffer */
lpb = clearRow - pwfb->ScanWidth;
rowSize = width * bytesPerPixel;
for (i=1; i<height; i++) {
memcpy(lpb, clearRow, rowSize);
lpb -= pwfb->ScanWidth;
}
} /* not done */
mask &= ~BUFFER_BIT_BACK_LEFT;
} /* back buffer */
 
/* front buffer */
if (mask & BUFFER_BIT_FRONT_LEFT) {
HDC DC = pwc->hDC;
HPEN Old_Pen = SelectObject(DC, pwc->clearPen);
HBRUSH Old_Brush = SelectObject(DC, pwc->clearBrush);
Rectangle(DC,
x,
FLIP(y) + 1,
x + width + 1,
FLIP(y) - height + 1);
SelectObject(DC, Old_Pen);
SelectObject(DC, Old_Brush);
mask &= ~BUFFER_BIT_FRONT_LEFT;
} /* front buffer */
/* Call swrast if there is anything left to clear (like DEPTH) */
if (mask)
_swrast_Clear(ctx, mask);
#undef FLIP
}
 
 
 
/**********************************************************************/
/***** BUFFER Functions *****/
/**********************************************************************/
 
 
 
 
static void
wmesa_delete_renderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb)
{
_mesa_delete_renderbuffer(ctx, rb);
}
 
 
/**
* This is called by Mesa whenever it determines that the window size
* has changed. Do whatever's needed to cope with that.
*/
static GLboolean
wmesa_renderbuffer_storage(struct gl_context *ctx,
struct gl_renderbuffer *rb,
GLenum internalFormat,
GLuint width,
GLuint height)
{
rb->Width = width;
rb->Height = height;
return GL_TRUE;
}
 
 
/**
* Called by ctx->Driver.ResizeBuffers()
* Resize the front/back colorbuffers to match the latest window size.
*/
static void
wmesa_resize_buffers(struct gl_context *ctx, struct gl_framebuffer *buffer,
GLuint width, GLuint height)
{
WMesaFramebuffer pwfb = wmesa_framebuffer(buffer);
 
if (pwfb->Base.Width != width || pwfb->Base.Height != height) {
/* Realloc back buffer */
if (ctx->Visual.doubleBufferMode == 1) {
wmDeleteBackingStore(pwfb);
wmCreateBackingStore(pwfb, width, height);
}
}
_mesa_resize_framebuffer(ctx, buffer, width, height);
}
 
 
/**
* Called by glViewport.
* This is a good time for us to poll the current window size and adjust
* our renderbuffers to match the current window size.
* Remember, we have no opportunity to respond to conventional
* resize events since the driver has no event loop.
* Thus, we poll.
* MakeCurrent also ends up making a call here, so that ensures
* we get the viewport set correctly, even if the app does not call
* glViewport and relies on the defaults.
*/
static void wmesa_viewport(struct gl_context *ctx,
GLint x, GLint y,
GLsizei width, GLsizei height)
{
GLuint new_width, new_height;
 
wmesa_get_buffer_size(ctx->WinSysDrawBuffer, &new_width, &new_height);
 
/**
* Resize buffers if the window size changed.
*/
wmesa_resize_buffers(ctx, ctx->WinSysDrawBuffer, new_width, new_height);
ctx->NewState |= _NEW_BUFFERS; /* to update scissor / window bounds */
}
 
 
 
 
/**
* Called when the driver should update it's state, based on the new_state
* flags.
*/
static void wmesa_update_state(struct gl_context *ctx, GLuint new_state)
{
_swrast_InvalidateState(ctx, new_state);
_swsetup_InvalidateState(ctx, new_state);
_vbo_InvalidateState(ctx, new_state);
_tnl_InvalidateState(ctx, new_state);
 
/* TODO - This code is not complete yet because I
* don't know what to do for all state updates.
*/
 
if (new_state & _NEW_BUFFERS) {
}
}
 
 
 
 
 
/**********************************************************************/
/***** WMESA Functions *****/
/**********************************************************************/
 
WMesaContext WMesaCreateContext(HDC hDC,
HPALETTE* Pal,
GLboolean rgb_flag,
GLboolean db_flag,
GLboolean alpha_flag)
{
WMesaContext c;
struct dd_function_table functions;
GLint red_bits, green_bits, blue_bits, alpha_bits;
struct gl_context *ctx;
struct gl_config *visual;
 
(void) Pal;
/* Indexed mode not supported */
if (!rgb_flag)
return NULL;
 
/* Allocate wmesa context */
c = CALLOC_STRUCT(wmesa_context);
if (!c)
return NULL;
 
#if 0
/* I do not understand this contributed code */
/* Support memory and device contexts */
if(WindowFromDC(hDC) != NULL) {
c->hDC = GetDC(WindowFromDC(hDC)); /* huh ???? */
}
else {
c->hDC = hDC;
}
#else
c->hDC = hDC;
#endif
 
/* Get data for visual */
/* Dealing with this is actually a bit of overkill because Mesa will end
* up treating all color component size requests less than 8 by using
* a single byte per channel. In addition, the interface to the span
* routines passes colors as an entire byte per channel anyway, so there
* is nothing to be saved by telling the visual to be 16 bits if the device
* is 16 bits. That is, Mesa is going to compute colors down to 8 bits per
* channel anyway.
* But we go through the motions here anyway.
*/
switch (GetDeviceCaps(c->hDC, BITSPIXEL)) {
case 16:
red_bits = green_bits = blue_bits = 5;
alpha_bits = 0;
break;
default:
red_bits = green_bits = blue_bits = 8;
alpha_bits = 8;
break;
}
/* Create visual based on flags */
visual = _mesa_create_visual(db_flag, /* db_flag */
GL_FALSE, /* stereo */
red_bits, green_bits, blue_bits, /* color RGB */
alpha_flag ? alpha_bits : 0, /* color A */
DEFAULT_SOFTWARE_DEPTH_BITS, /* depth_bits */
8, /* stencil_bits */
16,16,16, /* accum RGB */
alpha_flag ? 16 : 0, /* accum A */
1); /* num samples */
if (!visual) {
free(c);
return NULL;
}
 
/* Set up driver functions */
_mesa_init_driver_functions(&functions);
functions.GetString = wmesa_get_string;
functions.UpdateState = wmesa_update_state;
functions.Flush = wmesa_flush;
functions.Clear = clear;
functions.ResizeBuffers = wmesa_resize_buffers;
functions.Viewport = wmesa_viewport;
 
/* initialize the Mesa context data */
ctx = &c->gl_ctx;
_mesa_initialize_context(ctx, API_OPENGL_COMPAT, visual,
NULL, &functions);
 
/* visual no longer needed - it was copied by _mesa_initialize_context() */
_mesa_destroy_visual(visual);
 
_mesa_enable_sw_extensions(ctx);
_mesa_meta_init(ctx);
 
/* Initialize the software rasterizer and helper modules. */
if (!_swrast_CreateContext(ctx) ||
!_vbo_CreateContext(ctx) ||
!_tnl_CreateContext(ctx) ||
!_swsetup_CreateContext(ctx)) {
_mesa_free_context_data(ctx);
free(c);
return NULL;
}
_swsetup_Wakeup(ctx);
TNL_CONTEXT(ctx)->Driver.RunPipeline = _tnl_run_pipeline;
 
_mesa_compute_version(ctx);
 
/* Exec table initialization requires the version to be computed */
_mesa_initialize_dispatch_tables(ctx);
_mesa_initialize_vbo_vtxfmt(ctx);
 
return c;
}
 
 
void WMesaDestroyContext( WMesaContext pwc )
{
struct gl_context *ctx = &pwc->gl_ctx;
WMesaFramebuffer pwfb;
GET_CURRENT_CONTEXT(cur_ctx);
 
if (cur_ctx == ctx) {
/* unbind current if deleting current context */
WMesaMakeCurrent(NULL, NULL);
}
 
/* clean up frame buffer resources */
pwfb = wmesa_lookup_framebuffer(pwc->hDC);
if (pwfb) {
if (ctx->Visual.doubleBufferMode == 1)
wmDeleteBackingStore(pwfb);
wmesa_free_framebuffer(pwc->hDC);
}
 
/* Release for device, not memory contexts */
if (WindowFromDC(pwc->hDC) != NULL)
{
ReleaseDC(WindowFromDC(pwc->hDC), pwc->hDC);
}
DeleteObject(pwc->clearPen);
DeleteObject(pwc->clearBrush);
_mesa_meta_free(ctx);
 
_swsetup_DestroyContext(ctx);
_tnl_DestroyContext(ctx);
_vbo_DestroyContext(ctx);
_swrast_DestroyContext(ctx);
_mesa_free_context_data(ctx);
free(pwc);
}
 
 
/**
* Create a new color renderbuffer.
*/
static struct gl_renderbuffer *
wmesa_new_renderbuffer(void)
{
struct gl_renderbuffer *rb = CALLOC_STRUCT(gl_renderbuffer);
if (!rb)
return NULL;
 
_mesa_init_renderbuffer(rb, (GLuint)0);
rb->_BaseFormat = GL_RGBA;
rb->InternalFormat = GL_RGBA;
rb->Delete = wmesa_delete_renderbuffer;
rb->AllocStorage = wmesa_renderbuffer_storage;
return rb;
}
 
 
void WMesaMakeCurrent(WMesaContext c, HDC hdc)
{
WMesaFramebuffer pwfb;
 
{
/* return if already current */
GET_CURRENT_CONTEXT(ctx);
WMesaContext pwc = wmesa_context(ctx);
if (pwc && c == pwc && pwc->hDC == hdc)
return;
}
 
pwfb = wmesa_lookup_framebuffer(hdc);
 
/* Lazy creation of framebuffers */
if (c && !pwfb && hdc) {
struct gl_renderbuffer *rb;
struct gl_config *visual = &c->gl_ctx.Visual;
GLuint width, height;
 
get_window_size(hdc, &width, &height);
 
c->clearPen = CreatePen(PS_SOLID, 1, 0);
c->clearBrush = CreateSolidBrush(0);
 
pwfb = wmesa_new_framebuffer(hdc, visual);
 
/* Create back buffer if double buffered */
if (visual->doubleBufferMode == 1) {
wmCreateBackingStore(pwfb, width, height);
}
/* make render buffers */
if (visual->doubleBufferMode == 1) {
rb = wmesa_new_renderbuffer();
_mesa_add_renderbuffer(&pwfb->Base, BUFFER_BACK_LEFT, rb);
}
rb = wmesa_new_renderbuffer();
_mesa_add_renderbuffer(&pwfb->Base, BUFFER_FRONT_LEFT, rb);
 
/* Let Mesa own the Depth, Stencil, and Accum buffers */
_swrast_add_soft_renderbuffers(&pwfb->Base,
GL_FALSE, /* color */
visual->depthBits > 0,
visual->stencilBits > 0,
visual->accumRedBits > 0,
visual->alphaBits >0,
GL_FALSE);
}
 
if (c && pwfb)
_mesa_make_current(&c->gl_ctx, &pwfb->Base, &pwfb->Base);
else
_mesa_make_current(NULL, NULL, NULL);
}
 
 
void WMesaSwapBuffers( HDC hdc )
{
GET_CURRENT_CONTEXT(ctx);
WMesaContext pwc = wmesa_context(ctx);
WMesaFramebuffer pwfb = wmesa_lookup_framebuffer(hdc);
 
if (!pwfb) {
_mesa_problem(NULL, "wmesa: swapbuffers on unknown hdc");
return;
}
 
/* If we're swapping the buffer associated with the current context
* we have to flush any pending rendering commands first.
*/
if (pwc->hDC == hdc) {
_mesa_notifySwapBuffers(ctx);
 
BitBlt(pwfb->hDC, 0, 0, pwfb->Base.Width, pwfb->Base.Height,
pwfb->dib_hDC, 0, 0, SRCCOPY);
}
else {
/* XXX for now only allow swapping current window */
_mesa_problem(NULL, "wmesa: can't swap non-current window");
}
}
 
void WMesaShareLists(WMesaContext ctx_to_share, WMesaContext ctx)
{
_mesa_share_state(&ctx->gl_ctx, &ctx_to_share->gl_ctx);
}
 
/contrib/sdk/sources/Mesa/src/mesa/drivers/windows/gdi/wmesadef.h
0,0 → 1,43
#ifndef WMESADEF_H
#define WMESADEF_H
 
#include <windows.h>
 
#include "main/context.h"
 
 
/**
* The Windows Mesa rendering context, derived from struct gl_context.
*/
struct wmesa_context {
struct gl_context gl_ctx; /* The core GL/Mesa context */
HDC hDC;
COLORREF clearColorRef;
HPEN clearPen;
HBRUSH clearBrush;
};
 
 
/**
* Windows framebuffer, derived from gl_framebuffer
*/
struct wmesa_framebuffer
{
struct gl_framebuffer Base;
HDC hDC;
int pixelformat;
GLuint ScanWidth;
int cColorBits;
/* back buffer DIB fields */
HDC dib_hDC;
BITMAPINFO bmi;
HBITMAP hbmDIB;
HBITMAP hOldBitmap;
PBYTE pbPixels;
struct wmesa_framebuffer *next;
};
 
typedef struct wmesa_framebuffer *WMesaFramebuffer;
 
 
#endif /* WMESADEF_H */