mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 18:13:03 +00:00
Delete "ghost" old(*) files that have been mysteriously added back during the SVN-to-Git transition.
To check that these changes are correct, checkout in a directory (let's call it "ros_svn") the /trunk/reactos/ of our read-only SVN repo r76032 and in /trunk/reactos/modules/, the rosapps, rostests and wallpapers. In a second directory (let's call it "ros_git"), clone the corresponding Git-converted ReactOS directory. Before applying this patch (and the previous one that added back the empty directories), you should see additional files in ros_git that are not in ros_svn, corresponding to these files I'm deleting here (plus some .gitignore files), and you should also see additional files in ros_svn that do not appear in ros_git: these are the empty directories I've restored in my previous patch. Now, after the application of both the previous patch that restores the empty directories (and deletes the .gitignore files), and this patch that removes the ghost files, you should only see that the only differences between ros_git and ros_svn are the extra .keep files in the empty directories, and that's all! Command-line for the tests: diff --strip-trailing-cr -r ros_svn ros_git > diff_svn2git.txt "-r" means recursive, and "--strip-trailing-cr" ignores the CR-LF vs. LF (or CR) EOLs. (*): by "ghost" old(*) files I understand files that existed previously in the far past, that then were deleted long ago in SVN, and that popped out back during the Git migration.
This commit is contained in:
parent
acdf04bad2
commit
f9b6429468
151 changed files with 0 additions and 43256 deletions
|
@ -1,565 +0,0 @@
|
|||
/* Window-specific OpenGL functions implementation.
|
||||
*
|
||||
* Copyright (c) 1999 Lionel Ulmer
|
||||
* Copyright (c) 2005 Raphael Junqueira
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 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
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <math.h>
|
||||
#include <GL/gl.h>
|
||||
|
||||
#include <windef.h>
|
||||
#include <winbase.h>
|
||||
#include <wingdi.h>
|
||||
|
||||
#include "wine/debug.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(wgl);
|
||||
|
||||
/***********************************************************************
|
||||
* wglUseFontBitmaps_common
|
||||
*/
|
||||
static BOOL wglUseFontBitmaps_common( HDC hdc, DWORD first, DWORD count, DWORD listBase, BOOL unicode )
|
||||
{
|
||||
GLYPHMETRICS gm;
|
||||
unsigned int glyph, size = 0;
|
||||
void *bitmap = NULL, *gl_bitmap = NULL;
|
||||
int org_alignment;
|
||||
BOOL ret = TRUE;
|
||||
|
||||
glGetIntegerv(GL_UNPACK_ALIGNMENT, &org_alignment);
|
||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
|
||||
|
||||
for (glyph = first; glyph < first + count; glyph++) {
|
||||
static const MAT2 identity = { {0,1},{0,0},{0,0},{0,1} };
|
||||
unsigned int needed_size, height, width, width_int;
|
||||
|
||||
if (unicode)
|
||||
needed_size = GetGlyphOutlineW(hdc, glyph, GGO_BITMAP, &gm, 0, NULL, &identity);
|
||||
else
|
||||
needed_size = GetGlyphOutlineA(hdc, glyph, GGO_BITMAP, &gm, 0, NULL, &identity);
|
||||
|
||||
TRACE("Glyph: %3d / List: %d size %d\n", glyph, listBase, needed_size);
|
||||
if (needed_size == GDI_ERROR) {
|
||||
ret = FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
if (needed_size > size) {
|
||||
size = needed_size;
|
||||
HeapFree(GetProcessHeap(), 0, bitmap);
|
||||
HeapFree(GetProcessHeap(), 0, gl_bitmap);
|
||||
bitmap = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size);
|
||||
gl_bitmap = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size);
|
||||
}
|
||||
if (unicode)
|
||||
ret = (GetGlyphOutlineW(hdc, glyph, GGO_BITMAP, &gm, size, bitmap, &identity) != GDI_ERROR);
|
||||
else
|
||||
ret = (GetGlyphOutlineA(hdc, glyph, GGO_BITMAP, &gm, size, bitmap, &identity) != GDI_ERROR);
|
||||
if (!ret) break;
|
||||
|
||||
if (TRACE_ON(wgl)) {
|
||||
unsigned int bitmask;
|
||||
unsigned char *bitmap_ = bitmap;
|
||||
|
||||
TRACE(" - bbox: %d x %d\n", gm.gmBlackBoxX, gm.gmBlackBoxY);
|
||||
TRACE(" - origin: (%d, %d)\n", gm.gmptGlyphOrigin.x, gm.gmptGlyphOrigin.y);
|
||||
TRACE(" - increment: %d - %d\n", gm.gmCellIncX, gm.gmCellIncY);
|
||||
if (needed_size != 0) {
|
||||
TRACE(" - bitmap:\n");
|
||||
for (height = 0; height < gm.gmBlackBoxY; height++) {
|
||||
TRACE(" ");
|
||||
for (width = 0, bitmask = 0x80; width < gm.gmBlackBoxX; width++, bitmask >>= 1) {
|
||||
if (bitmask == 0) {
|
||||
bitmap_ += 1;
|
||||
bitmask = 0x80;
|
||||
}
|
||||
if (*bitmap_ & bitmask)
|
||||
TRACE("*");
|
||||
else
|
||||
TRACE(" ");
|
||||
}
|
||||
bitmap_ += (4 - ((UINT_PTR)bitmap_ & 0x03));
|
||||
TRACE("\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* In OpenGL, the bitmap is drawn from the bottom to the top... So we need to invert the
|
||||
* glyph for it to be drawn properly.
|
||||
*/
|
||||
if (needed_size != 0) {
|
||||
width_int = (gm.gmBlackBoxX + 31) / 32;
|
||||
for (height = 0; height < gm.gmBlackBoxY; height++) {
|
||||
for (width = 0; width < width_int; width++) {
|
||||
((int *) gl_bitmap)[(gm.gmBlackBoxY - height - 1) * width_int + width] =
|
||||
((int *) bitmap)[height * width_int + width];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
glNewList(listBase++, GL_COMPILE);
|
||||
if (needed_size != 0) {
|
||||
glBitmap(gm.gmBlackBoxX, gm.gmBlackBoxY,
|
||||
0 - gm.gmptGlyphOrigin.x, (int) gm.gmBlackBoxY - gm.gmptGlyphOrigin.y,
|
||||
gm.gmCellIncX, gm.gmCellIncY,
|
||||
gl_bitmap);
|
||||
} else {
|
||||
/* This is the case of 'empty' glyphs like the space character */
|
||||
glBitmap(0, 0, 0, 0, gm.gmCellIncX, gm.gmCellIncY, NULL);
|
||||
}
|
||||
glEndList();
|
||||
}
|
||||
|
||||
glPixelStorei(GL_UNPACK_ALIGNMENT, org_alignment);
|
||||
HeapFree(GetProcessHeap(), 0, bitmap);
|
||||
HeapFree(GetProcessHeap(), 0, gl_bitmap);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* wglUseFontBitmapsA (OPENGL32.@)
|
||||
*/
|
||||
BOOL WINAPI wglUseFontBitmapsA(HDC hdc, DWORD first, DWORD count, DWORD listBase)
|
||||
{
|
||||
return wglUseFontBitmaps_common( hdc, first, count, listBase, FALSE );
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* wglUseFontBitmapsW (OPENGL32.@)
|
||||
*/
|
||||
BOOL WINAPI wglUseFontBitmapsW(HDC hdc, DWORD first, DWORD count, DWORD listBase)
|
||||
{
|
||||
return wglUseFontBitmaps_common( hdc, first, count, listBase, TRUE );
|
||||
}
|
||||
|
||||
/* FIXME: should probably have a glu.h header */
|
||||
|
||||
typedef struct GLUtesselator GLUtesselator;
|
||||
typedef void (WINAPI *_GLUfuncptr)(void);
|
||||
|
||||
#define GLU_TESS_BEGIN 100100
|
||||
#define GLU_TESS_VERTEX 100101
|
||||
#define GLU_TESS_END 100102
|
||||
|
||||
static GLUtesselator * (WINAPI *pgluNewTess)(void);
|
||||
static void (WINAPI *pgluDeleteTess)(GLUtesselator *tess);
|
||||
static void (WINAPI *pgluTessNormal)(GLUtesselator *tess, GLdouble x, GLdouble y, GLdouble z);
|
||||
static void (WINAPI *pgluTessBeginPolygon)(GLUtesselator *tess, void *polygon_data);
|
||||
static void (WINAPI *pgluTessEndPolygon)(GLUtesselator *tess);
|
||||
static void (WINAPI *pgluTessCallback)(GLUtesselator *tess, GLenum which, _GLUfuncptr fn);
|
||||
static void (WINAPI *pgluTessBeginContour)(GLUtesselator *tess);
|
||||
static void (WINAPI *pgluTessEndContour)(GLUtesselator *tess);
|
||||
static void (WINAPI *pgluTessVertex)(GLUtesselator *tess, GLdouble *location, GLvoid* data);
|
||||
|
||||
static HMODULE load_libglu(void)
|
||||
{
|
||||
static const WCHAR glu32W[] = {'g','l','u','3','2','.','d','l','l',0};
|
||||
static int already_loaded;
|
||||
static HMODULE module;
|
||||
|
||||
if (already_loaded) return module;
|
||||
already_loaded = 1;
|
||||
|
||||
TRACE("Trying to load GLU library\n");
|
||||
module = LoadLibraryW( glu32W );
|
||||
if (!module)
|
||||
{
|
||||
WARN("Failed to load glu32\n");
|
||||
return NULL;
|
||||
}
|
||||
#define LOAD_FUNCPTR(f) p##f = (void *)GetProcAddress( module, #f )
|
||||
LOAD_FUNCPTR(gluNewTess);
|
||||
LOAD_FUNCPTR(gluDeleteTess);
|
||||
LOAD_FUNCPTR(gluTessBeginContour);
|
||||
LOAD_FUNCPTR(gluTessNormal);
|
||||
LOAD_FUNCPTR(gluTessBeginPolygon);
|
||||
LOAD_FUNCPTR(gluTessCallback);
|
||||
LOAD_FUNCPTR(gluTessEndContour);
|
||||
LOAD_FUNCPTR(gluTessEndPolygon);
|
||||
LOAD_FUNCPTR(gluTessVertex);
|
||||
#undef LOAD_FUNCPTR
|
||||
return module;
|
||||
}
|
||||
|
||||
static void fixed_to_double(POINTFX fixed, UINT em_size, GLdouble vertex[3])
|
||||
{
|
||||
vertex[0] = (fixed.x.value + (GLdouble)fixed.x.fract / (1 << 16)) / em_size;
|
||||
vertex[1] = (fixed.y.value + (GLdouble)fixed.y.fract / (1 << 16)) / em_size;
|
||||
vertex[2] = 0.0;
|
||||
}
|
||||
|
||||
static void WINAPI tess_callback_vertex(GLvoid *vertex)
|
||||
{
|
||||
GLdouble *dbl = vertex;
|
||||
TRACE("%f, %f, %f\n", dbl[0], dbl[1], dbl[2]);
|
||||
glVertex3dv(vertex);
|
||||
}
|
||||
|
||||
static void WINAPI tess_callback_begin(GLenum which)
|
||||
{
|
||||
TRACE("%d\n", which);
|
||||
glBegin(which);
|
||||
}
|
||||
|
||||
static void WINAPI tess_callback_end(void)
|
||||
{
|
||||
TRACE("\n");
|
||||
glEnd();
|
||||
}
|
||||
|
||||
typedef struct _bezier_vector {
|
||||
GLdouble x;
|
||||
GLdouble y;
|
||||
} bezier_vector;
|
||||
|
||||
static double bezier_deviation_squared(const bezier_vector *p)
|
||||
{
|
||||
bezier_vector deviation;
|
||||
bezier_vector vertex;
|
||||
bezier_vector base;
|
||||
double base_length;
|
||||
double dot;
|
||||
|
||||
vertex.x = (p[0].x + p[1].x*2 + p[2].x)/4 - p[0].x;
|
||||
vertex.y = (p[0].y + p[1].y*2 + p[2].y)/4 - p[0].y;
|
||||
|
||||
base.x = p[2].x - p[0].x;
|
||||
base.y = p[2].y - p[0].y;
|
||||
|
||||
base_length = sqrt(base.x*base.x + base.y*base.y);
|
||||
base.x /= base_length;
|
||||
base.y /= base_length;
|
||||
|
||||
dot = base.x*vertex.x + base.y*vertex.y;
|
||||
dot = min(max(dot, 0.0), base_length);
|
||||
base.x *= dot;
|
||||
base.y *= dot;
|
||||
|
||||
deviation.x = vertex.x-base.x;
|
||||
deviation.y = vertex.y-base.y;
|
||||
|
||||
return deviation.x*deviation.x + deviation.y*deviation.y;
|
||||
}
|
||||
|
||||
static int bezier_approximate(const bezier_vector *p, bezier_vector *points, FLOAT deviation)
|
||||
{
|
||||
bezier_vector first_curve[3];
|
||||
bezier_vector second_curve[3];
|
||||
bezier_vector vertex;
|
||||
int total_vertices;
|
||||
|
||||
if(bezier_deviation_squared(p) <= deviation*deviation)
|
||||
{
|
||||
if(points)
|
||||
*points = p[2];
|
||||
return 1;
|
||||
}
|
||||
|
||||
vertex.x = (p[0].x + p[1].x*2 + p[2].x)/4;
|
||||
vertex.y = (p[0].y + p[1].y*2 + p[2].y)/4;
|
||||
|
||||
first_curve[0] = p[0];
|
||||
first_curve[1].x = (p[0].x + p[1].x)/2;
|
||||
first_curve[1].y = (p[0].y + p[1].y)/2;
|
||||
first_curve[2] = vertex;
|
||||
|
||||
second_curve[0] = vertex;
|
||||
second_curve[1].x = (p[2].x + p[1].x)/2;
|
||||
second_curve[1].y = (p[2].y + p[1].y)/2;
|
||||
second_curve[2] = p[2];
|
||||
|
||||
total_vertices = bezier_approximate(first_curve, points, deviation);
|
||||
if(points)
|
||||
points += total_vertices;
|
||||
total_vertices += bezier_approximate(second_curve, points, deviation);
|
||||
return total_vertices;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* wglUseFontOutlines_common
|
||||
*/
|
||||
static BOOL wglUseFontOutlines_common(HDC hdc,
|
||||
DWORD first,
|
||||
DWORD count,
|
||||
DWORD listBase,
|
||||
FLOAT deviation,
|
||||
FLOAT extrusion,
|
||||
int format,
|
||||
LPGLYPHMETRICSFLOAT lpgmf,
|
||||
BOOL unicode)
|
||||
{
|
||||
UINT glyph;
|
||||
const MAT2 identity = {{0,1},{0,0},{0,0},{0,1}};
|
||||
GLUtesselator *tess = NULL;
|
||||
LOGFONTW lf;
|
||||
HFONT old_font, unscaled_font;
|
||||
UINT em_size = 1024;
|
||||
RECT rc;
|
||||
|
||||
TRACE("(%p, %d, %d, %d, %f, %f, %d, %p, %s)\n", hdc, first, count,
|
||||
listBase, deviation, extrusion, format, lpgmf, unicode ? "W" : "A");
|
||||
|
||||
if(deviation <= 0.0)
|
||||
deviation = 1.0/em_size;
|
||||
|
||||
if(format == WGL_FONT_POLYGONS)
|
||||
{
|
||||
if (!load_libglu())
|
||||
{
|
||||
ERR("glu32 is required for this function but isn't available\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
tess = pgluNewTess();
|
||||
if(!tess) return FALSE;
|
||||
pgluTessCallback(tess, GLU_TESS_VERTEX, (_GLUfuncptr)tess_callback_vertex);
|
||||
pgluTessCallback(tess, GLU_TESS_BEGIN, (_GLUfuncptr)tess_callback_begin);
|
||||
pgluTessCallback(tess, GLU_TESS_END, tess_callback_end);
|
||||
}
|
||||
|
||||
GetObjectW(GetCurrentObject(hdc, OBJ_FONT), sizeof(lf), &lf);
|
||||
rc.left = rc.right = rc.bottom = 0;
|
||||
rc.top = em_size;
|
||||
DPtoLP(hdc, (POINT*)&rc, 2);
|
||||
lf.lfHeight = -abs(rc.top - rc.bottom);
|
||||
lf.lfOrientation = lf.lfEscapement = 0;
|
||||
unscaled_font = CreateFontIndirectW(&lf);
|
||||
old_font = SelectObject(hdc, unscaled_font);
|
||||
|
||||
for (glyph = first; glyph < first + count; glyph++)
|
||||
{
|
||||
DWORD needed;
|
||||
GLYPHMETRICS gm;
|
||||
BYTE *buf;
|
||||
TTPOLYGONHEADER *pph;
|
||||
TTPOLYCURVE *ppc;
|
||||
GLdouble *vertices = NULL;
|
||||
int vertex_total = -1;
|
||||
|
||||
if(unicode)
|
||||
needed = GetGlyphOutlineW(hdc, glyph, GGO_NATIVE, &gm, 0, NULL, &identity);
|
||||
else
|
||||
needed = GetGlyphOutlineA(hdc, glyph, GGO_NATIVE, &gm, 0, NULL, &identity);
|
||||
|
||||
if(needed == GDI_ERROR)
|
||||
goto error;
|
||||
|
||||
buf = HeapAlloc(GetProcessHeap(), 0, needed);
|
||||
|
||||
if(unicode)
|
||||
GetGlyphOutlineW(hdc, glyph, GGO_NATIVE, &gm, needed, buf, &identity);
|
||||
else
|
||||
GetGlyphOutlineA(hdc, glyph, GGO_NATIVE, &gm, needed, buf, &identity);
|
||||
|
||||
TRACE("glyph %d\n", glyph);
|
||||
|
||||
if(lpgmf)
|
||||
{
|
||||
lpgmf->gmfBlackBoxX = (float)gm.gmBlackBoxX / em_size;
|
||||
lpgmf->gmfBlackBoxY = (float)gm.gmBlackBoxY / em_size;
|
||||
lpgmf->gmfptGlyphOrigin.x = (float)gm.gmptGlyphOrigin.x / em_size;
|
||||
lpgmf->gmfptGlyphOrigin.y = (float)gm.gmptGlyphOrigin.y / em_size;
|
||||
lpgmf->gmfCellIncX = (float)gm.gmCellIncX / em_size;
|
||||
lpgmf->gmfCellIncY = (float)gm.gmCellIncY / em_size;
|
||||
|
||||
TRACE("%fx%f at %f,%f inc %f,%f\n", lpgmf->gmfBlackBoxX, lpgmf->gmfBlackBoxY,
|
||||
lpgmf->gmfptGlyphOrigin.x, lpgmf->gmfptGlyphOrigin.y, lpgmf->gmfCellIncX, lpgmf->gmfCellIncY);
|
||||
lpgmf++;
|
||||
}
|
||||
|
||||
glNewList(listBase++, GL_COMPILE);
|
||||
glFrontFace(GL_CCW);
|
||||
if(format == WGL_FONT_POLYGONS)
|
||||
{
|
||||
glNormal3d(0.0, 0.0, 1.0);
|
||||
pgluTessNormal(tess, 0, 0, 1);
|
||||
pgluTessBeginPolygon(tess, NULL);
|
||||
}
|
||||
|
||||
while(!vertices)
|
||||
{
|
||||
if(vertex_total != -1)
|
||||
vertices = HeapAlloc(GetProcessHeap(), 0, vertex_total * 3 * sizeof(GLdouble));
|
||||
vertex_total = 0;
|
||||
|
||||
pph = (TTPOLYGONHEADER*)buf;
|
||||
while((BYTE*)pph < buf + needed)
|
||||
{
|
||||
GLdouble previous[3];
|
||||
fixed_to_double(pph->pfxStart, em_size, previous);
|
||||
|
||||
if(vertices)
|
||||
TRACE("\tstart %d, %d\n", pph->pfxStart.x.value, pph->pfxStart.y.value);
|
||||
|
||||
if(format == WGL_FONT_POLYGONS)
|
||||
pgluTessBeginContour(tess);
|
||||
else
|
||||
glBegin(GL_LINE_LOOP);
|
||||
|
||||
if(vertices)
|
||||
{
|
||||
fixed_to_double(pph->pfxStart, em_size, vertices);
|
||||
if(format == WGL_FONT_POLYGONS)
|
||||
pgluTessVertex(tess, vertices, vertices);
|
||||
else
|
||||
glVertex3d(vertices[0], vertices[1], vertices[2]);
|
||||
vertices += 3;
|
||||
}
|
||||
vertex_total++;
|
||||
|
||||
ppc = (TTPOLYCURVE*)((char*)pph + sizeof(*pph));
|
||||
while((char*)ppc < (char*)pph + pph->cb)
|
||||
{
|
||||
int i, j;
|
||||
int num;
|
||||
|
||||
switch(ppc->wType) {
|
||||
case TT_PRIM_LINE:
|
||||
for(i = 0; i < ppc->cpfx; i++)
|
||||
{
|
||||
if(vertices)
|
||||
{
|
||||
TRACE("\t\tline to %d, %d\n",
|
||||
ppc->apfx[i].x.value, ppc->apfx[i].y.value);
|
||||
fixed_to_double(ppc->apfx[i], em_size, vertices);
|
||||
if(format == WGL_FONT_POLYGONS)
|
||||
pgluTessVertex(tess, vertices, vertices);
|
||||
else
|
||||
glVertex3d(vertices[0], vertices[1], vertices[2]);
|
||||
vertices += 3;
|
||||
}
|
||||
fixed_to_double(ppc->apfx[i], em_size, previous);
|
||||
vertex_total++;
|
||||
}
|
||||
break;
|
||||
|
||||
case TT_PRIM_QSPLINE:
|
||||
for(i = 0; i < ppc->cpfx-1; i++)
|
||||
{
|
||||
bezier_vector curve[3];
|
||||
bezier_vector *points;
|
||||
GLdouble curve_vertex[3];
|
||||
|
||||
if(vertices)
|
||||
TRACE("\t\tcurve %d,%d %d,%d\n",
|
||||
ppc->apfx[i].x.value, ppc->apfx[i].y.value,
|
||||
ppc->apfx[i + 1].x.value, ppc->apfx[i + 1].y.value);
|
||||
|
||||
curve[0].x = previous[0];
|
||||
curve[0].y = previous[1];
|
||||
fixed_to_double(ppc->apfx[i], em_size, curve_vertex);
|
||||
curve[1].x = curve_vertex[0];
|
||||
curve[1].y = curve_vertex[1];
|
||||
fixed_to_double(ppc->apfx[i + 1], em_size, curve_vertex);
|
||||
curve[2].x = curve_vertex[0];
|
||||
curve[2].y = curve_vertex[1];
|
||||
if(i < ppc->cpfx-2)
|
||||
{
|
||||
curve[2].x = (curve[1].x + curve[2].x)/2;
|
||||
curve[2].y = (curve[1].y + curve[2].y)/2;
|
||||
}
|
||||
num = bezier_approximate(curve, NULL, deviation);
|
||||
points = HeapAlloc(GetProcessHeap(), 0, num*sizeof(bezier_vector));
|
||||
num = bezier_approximate(curve, points, deviation);
|
||||
vertex_total += num;
|
||||
if(vertices)
|
||||
{
|
||||
for(j=0; j<num; j++)
|
||||
{
|
||||
TRACE("\t\t\tvertex at %f,%f\n", points[j].x, points[j].y);
|
||||
vertices[0] = points[j].x;
|
||||
vertices[1] = points[j].y;
|
||||
vertices[2] = 0.0;
|
||||
if(format == WGL_FONT_POLYGONS)
|
||||
pgluTessVertex(tess, vertices, vertices);
|
||||
else
|
||||
glVertex3d(vertices[0], vertices[1], vertices[2]);
|
||||
vertices += 3;
|
||||
}
|
||||
}
|
||||
HeapFree(GetProcessHeap(), 0, points);
|
||||
previous[0] = curve[2].x;
|
||||
previous[1] = curve[2].y;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
ERR("\t\tcurve type = %d\n", ppc->wType);
|
||||
if(format == WGL_FONT_POLYGONS)
|
||||
pgluTessEndContour(tess);
|
||||
else
|
||||
glEnd();
|
||||
goto error_in_list;
|
||||
}
|
||||
|
||||
ppc = (TTPOLYCURVE*)((char*)ppc + sizeof(*ppc) +
|
||||
(ppc->cpfx - 1) * sizeof(POINTFX));
|
||||
}
|
||||
if(format == WGL_FONT_POLYGONS)
|
||||
pgluTessEndContour(tess);
|
||||
else
|
||||
glEnd();
|
||||
pph = (TTPOLYGONHEADER*)((char*)pph + pph->cb);
|
||||
}
|
||||
}
|
||||
|
||||
error_in_list:
|
||||
if(format == WGL_FONT_POLYGONS)
|
||||
pgluTessEndPolygon(tess);
|
||||
glTranslated((GLdouble)gm.gmCellIncX / em_size, (GLdouble)gm.gmCellIncY / em_size, 0.0);
|
||||
glEndList();
|
||||
HeapFree(GetProcessHeap(), 0, buf);
|
||||
HeapFree(GetProcessHeap(), 0, vertices);
|
||||
}
|
||||
|
||||
error:
|
||||
DeleteObject(SelectObject(hdc, old_font));
|
||||
if(format == WGL_FONT_POLYGONS)
|
||||
pgluDeleteTess(tess);
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* wglUseFontOutlinesA (OPENGL32.@)
|
||||
*/
|
||||
BOOL WINAPI wglUseFontOutlinesA(HDC hdc,
|
||||
DWORD first,
|
||||
DWORD count,
|
||||
DWORD listBase,
|
||||
FLOAT deviation,
|
||||
FLOAT extrusion,
|
||||
int format,
|
||||
LPGLYPHMETRICSFLOAT lpgmf)
|
||||
{
|
||||
return wglUseFontOutlines_common(hdc, first, count, listBase, deviation, extrusion, format, lpgmf, FALSE);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* wglUseFontOutlinesW (OPENGL32.@)
|
||||
*/
|
||||
BOOL WINAPI wglUseFontOutlinesW(HDC hdc,
|
||||
DWORD first,
|
||||
DWORD count,
|
||||
DWORD listBase,
|
||||
FLOAT deviation,
|
||||
FLOAT extrusion,
|
||||
int format,
|
||||
LPGLYPHMETRICSFLOAT lpgmf)
|
||||
{
|
||||
return wglUseFontOutlines_common(hdc, first, count, listBase, deviation, extrusion, format, lpgmf, TRUE);
|
||||
}
|
|
@ -1,134 +0,0 @@
|
|||
/*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
* FILE: lib/opengl32/gl.c
|
||||
* PURPOSE: OpenGL32 lib, glXXX functions
|
||||
* PROGRAMMER: Anich Gregor (blight)
|
||||
* UPDATE HISTORY:
|
||||
* Feb 2, 2004: Created
|
||||
*/
|
||||
|
||||
/* On a x86 we call the ICD functions in a special-way:
|
||||
*
|
||||
* For every glXXX function we export a glXXX entry-point which loads the
|
||||
* matching "real" function pointer from the NtCurrentTeb()->glDispatchTable
|
||||
* for gl functions in teblist.h and for others it gets the pointer from
|
||||
* NtCurrentTeb()->glTable and jmps to the address, leaving the stack alone and
|
||||
* letting the "real" function return for us.
|
||||
* Royce has implemented this in NASM =D
|
||||
*
|
||||
* On other machines we use C to forward the calls (slow...)
|
||||
*/
|
||||
|
||||
#include "opengl32.h"
|
||||
|
||||
#if defined(_M_IX86)
|
||||
C_ASSERT(FIELD_OFFSET(TEB, glTable) == 0xbe8);
|
||||
#endif
|
||||
|
||||
int WINAPI glEmptyFunc0( void ) { return 0; }
|
||||
int WINAPI glEmptyFunc4( long l1 ) { return 0; }
|
||||
int WINAPI glEmptyFunc8( long l1, long l2 ) { return 0; }
|
||||
int WINAPI glEmptyFunc12( long l1, long l2, long l3 ) { return 0; }
|
||||
int WINAPI glEmptyFunc16( long l1, long l2, long l3, long l4 ) { return 0; }
|
||||
int WINAPI glEmptyFunc20( long l1, long l2, long l3, long l4, long l5 )
|
||||
{ return 0; }
|
||||
int WINAPI glEmptyFunc24( long l1, long l2, long l3, long l4, long l5,
|
||||
long l6 ) { return 0; }
|
||||
int WINAPI glEmptyFunc28( long l1, long l2, long l3, long l4, long l5,
|
||||
long l6, long l7 ) { return 0; }
|
||||
int WINAPI glEmptyFunc32( long l1, long l2, long l3, long l4, long l5,
|
||||
long l6, long l7, long l8 ) { return 0; }
|
||||
int WINAPI glEmptyFunc36( long l1, long l2, long l3, long l4, long l5,
|
||||
long l6, long l7, long l8, long l9 ) { return 0; }
|
||||
int WINAPI glEmptyFunc40( long l1, long l2, long l3, long l4, long l5,
|
||||
long l6, long l7, long l8, long l9, long l10 )
|
||||
{ return 0; }
|
||||
int WINAPI glEmptyFunc44( long l1, long l2, long l3, long l4, long l5,
|
||||
long l6, long l7, long l8, long l9, long l10,
|
||||
long l11 ) { return 0; }
|
||||
int WINAPI glEmptyFunc48( long l1, long l2, long l3, long l4, long l5,
|
||||
long l6, long l7, long l8, long l9, long l10,
|
||||
long l11, long l12 ) { return 0; }
|
||||
int WINAPI glEmptyFunc52( long l1, long l2, long l3, long l4, long l5,
|
||||
long l6, long l7, long l8, long l9, long l10,
|
||||
long l11, long l12, long l13 ) { return 0; }
|
||||
int WINAPI glEmptyFunc56( long l1, long l2, long l3, long l4, long l5,
|
||||
long l6, long l7, long l8, long l9, long l10,
|
||||
long l11, long l12, long l13, long l14 )
|
||||
{ return 0; }
|
||||
|
||||
#if defined(_M_IX86)
|
||||
# define FOO(x) #x
|
||||
|
||||
#ifdef __GNUC__
|
||||
# define X(func, ret, typeargs, args, icdidx, tebidx, stack) \
|
||||
__asm__(".align 4" "\n\t" \
|
||||
".globl _"#func"@"#stack "\n\t" \
|
||||
"_"#func"@"#stack":" "\n\t" \
|
||||
" movl %fs:0x18, %eax" "\n\t" \
|
||||
" movl 0xbe8(%eax), %eax" "\n\t" \
|
||||
" jmp *"FOO((icdidx*4))"(%eax)" "\n\t");
|
||||
#elif defined(_MSC_VER)
|
||||
# define X(func, ret, typeargs, args, icdidx, tebidx, stack) \
|
||||
__declspec(naked) ret WINAPI func typeargs \
|
||||
{ \
|
||||
__asm { mov eax, dword ptr fs:[18h] }; \
|
||||
__asm { mov eax, dword ptr [eax+0be8h] }; \
|
||||
__asm { jmp dword ptr [eax+icdidx*4] }; \
|
||||
}
|
||||
#else
|
||||
# define X(func, ret, typeargs, args, icdidx, tebidx, stack) \
|
||||
ret WINAPI func typeargs \
|
||||
{ \
|
||||
PROC *table; \
|
||||
PROC fn; \
|
||||
if (tebidx >= 0 && 0) \
|
||||
{ \
|
||||
table = (PROC *)NtCurrentTeb()->glDispatchTable; \
|
||||
fn = table[tebidx]; \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
table = (PROC *)NtCurrentTeb()->glTable; \
|
||||
fn = table[icdidx]; \
|
||||
} \
|
||||
return (ret)((ret(*)typeargs)fn)args; \
|
||||
}
|
||||
#endif
|
||||
|
||||
GLFUNCS_MACRO
|
||||
# undef FOO
|
||||
# undef X
|
||||
#else /* defined(_M_IX86) */
|
||||
# define X(func, ret, typeargs, args, icdidx, tebidx, stack) \
|
||||
ret WINAPI func typeargs \
|
||||
{ \
|
||||
PROC *table; \
|
||||
PROC fn; \
|
||||
if (tebidx >= 0 && 0) \
|
||||
{ \
|
||||
table = (PROC *)NtCurrentTeb()->glDispatchTable; \
|
||||
fn = table[tebidx]; \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
table = (PROC *)NtCurrentTeb()->glTable; \
|
||||
fn = table[icdidx]; \
|
||||
} \
|
||||
return (ret)((ret(*)typeargs)fn)args; \
|
||||
}
|
||||
|
||||
GLFUNCS_MACRO
|
||||
|
||||
# undef X
|
||||
#endif /* !defined(_M_IX86) */
|
||||
|
||||
/* Unknown debugging function */
|
||||
GLint WINAPI glDebugEntry( GLint unknown1, GLint unknown2 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* EOF */
|
|
@ -1,336 +0,0 @@
|
|||
ICD_ENTRY(glNewList) //0
|
||||
ICD_ENTRY(glEndList) //1
|
||||
ICD_ENTRY(glCallList) //2
|
||||
ICD_ENTRY(glCallLists) //3
|
||||
ICD_ENTRY(glDeleteLists) //4
|
||||
ICD_ENTRY(glGenLists) //5
|
||||
ICD_ENTRY(glListBase) //6
|
||||
ICD_ENTRY(glBegin) //7
|
||||
ICD_ENTRY(glBitmap) //8
|
||||
ICD_ENTRY(glColor3b) //9
|
||||
ICD_ENTRY(glColor3bv) //10
|
||||
ICD_ENTRY(glColor3d) //11
|
||||
ICD_ENTRY(glColor3dv) //12
|
||||
ICD_ENTRY(glColor3f) //13
|
||||
ICD_ENTRY(glColor3fv) //14
|
||||
ICD_ENTRY(glColor3i) //15
|
||||
ICD_ENTRY(glColor3iv) //16
|
||||
ICD_ENTRY(glColor3s) //17
|
||||
ICD_ENTRY(glColor3sv) //18
|
||||
ICD_ENTRY(glColor3ub) //19
|
||||
ICD_ENTRY(glColor3ubv) //20
|
||||
ICD_ENTRY(glColor3ui) //21
|
||||
ICD_ENTRY(glColor3uiv) //22
|
||||
ICD_ENTRY(glColor3us) //23
|
||||
ICD_ENTRY(glColor3usv) //24
|
||||
ICD_ENTRY(glColor4b) //25
|
||||
ICD_ENTRY(glColor4bv) //26
|
||||
ICD_ENTRY(glColor4d) //27
|
||||
ICD_ENTRY(glColor4dv) //28
|
||||
ICD_ENTRY(glColor4f) //29
|
||||
ICD_ENTRY(glColor4fv) //30
|
||||
ICD_ENTRY(glColor4i) //31
|
||||
ICD_ENTRY(glColor4iv) //32
|
||||
ICD_ENTRY(glColor4s) //33
|
||||
ICD_ENTRY(glColor4sv) //34
|
||||
ICD_ENTRY(glColor4ub) //35
|
||||
ICD_ENTRY(glColor4ubv) //36
|
||||
ICD_ENTRY(glColor4ui) //37
|
||||
ICD_ENTRY(glColor4uiv) //38
|
||||
ICD_ENTRY(glColor4us) //39
|
||||
ICD_ENTRY(glColor4usv) //40
|
||||
ICD_ENTRY(glEdgeFlag) //41
|
||||
ICD_ENTRY(glEdgeFlagv) //42
|
||||
ICD_ENTRY(glEnd) //43
|
||||
ICD_ENTRY(glIndexd) //44
|
||||
ICD_ENTRY(glIndexdv) //45
|
||||
ICD_ENTRY(glIndexf) //46
|
||||
ICD_ENTRY(glIndexfv) //47
|
||||
ICD_ENTRY(glIndexi) //48
|
||||
ICD_ENTRY(glIndexiv) //49
|
||||
ICD_ENTRY(glIndexs) //50
|
||||
ICD_ENTRY(glIndexsv) //51
|
||||
ICD_ENTRY(glNormal3b) //52
|
||||
ICD_ENTRY(glNormal3bv) //53
|
||||
ICD_ENTRY(glNormal3d) //54
|
||||
ICD_ENTRY(glNormal3dv) //55
|
||||
ICD_ENTRY(glNormal3f) //56
|
||||
ICD_ENTRY(glNormal3fv) //57
|
||||
ICD_ENTRY(glNormal3i) //58
|
||||
ICD_ENTRY(glNormal3iv) //59
|
||||
ICD_ENTRY(glNormal3s) //60
|
||||
ICD_ENTRY(glNormal3sv) //61
|
||||
ICD_ENTRY(glRasterPos2d) //62
|
||||
ICD_ENTRY(glRasterPos2dv) //63
|
||||
ICD_ENTRY(glRasterPos2f) //64
|
||||
ICD_ENTRY(glRasterPos2fv) //65
|
||||
ICD_ENTRY(glRasterPos2i) //66
|
||||
ICD_ENTRY(glRasterPos2iv) //67
|
||||
ICD_ENTRY(glRasterPos2s) //68
|
||||
ICD_ENTRY(glRasterPos2sv) //69
|
||||
ICD_ENTRY(glRasterPos3d) //70
|
||||
ICD_ENTRY(glRasterPos3dv) //71
|
||||
ICD_ENTRY(glRasterPos3f) //72
|
||||
ICD_ENTRY(glRasterPos3fv) //73
|
||||
ICD_ENTRY(glRasterPos3i) //74
|
||||
ICD_ENTRY(glRasterPos3iv) //75
|
||||
ICD_ENTRY(glRasterPos3s) //76
|
||||
ICD_ENTRY(glRasterPos3sv) //77
|
||||
ICD_ENTRY(glRasterPos4d) //78
|
||||
ICD_ENTRY(glRasterPos4dv) //79
|
||||
ICD_ENTRY(glRasterPos4f) //80
|
||||
ICD_ENTRY(glRasterPos4fv) //81
|
||||
ICD_ENTRY(glRasterPos4i) //82
|
||||
ICD_ENTRY(glRasterPos4iv) //83
|
||||
ICD_ENTRY(glRasterPos4s) //84
|
||||
ICD_ENTRY(glRasterPos4sv) //85
|
||||
ICD_ENTRY(glRectd) //86
|
||||
ICD_ENTRY(glRectdv) //87
|
||||
ICD_ENTRY(glRectf) //88
|
||||
ICD_ENTRY(glRectfv) //89
|
||||
ICD_ENTRY(glRecti) //90
|
||||
ICD_ENTRY(glRectiv) //91
|
||||
ICD_ENTRY(glRects) //92
|
||||
ICD_ENTRY(glRectsv) //93
|
||||
ICD_ENTRY(glTexCoord1d) //94
|
||||
ICD_ENTRY(glTexCoord1dv) //95
|
||||
ICD_ENTRY(glTexCoord1f) //96
|
||||
ICD_ENTRY(glTexCoord1fv) //97
|
||||
ICD_ENTRY(glTexCoord1i) //98
|
||||
ICD_ENTRY(glTexCoord1iv) //99
|
||||
ICD_ENTRY(glTexCoord1s) //100
|
||||
ICD_ENTRY(glTexCoord1sv) //101
|
||||
ICD_ENTRY(glTexCoord2d) //102
|
||||
ICD_ENTRY(glTexCoord2dv) //103
|
||||
ICD_ENTRY(glTexCoord2f) //104
|
||||
ICD_ENTRY(glTexCoord2fv) //105
|
||||
ICD_ENTRY(glTexCoord2i) //106
|
||||
ICD_ENTRY(glTexCoord2iv) //107
|
||||
ICD_ENTRY(glTexCoord2s) //108
|
||||
ICD_ENTRY(glTexCoord2sv) //109
|
||||
ICD_ENTRY(glTexCoord3d) //110
|
||||
ICD_ENTRY(glTexCoord3dv) //111
|
||||
ICD_ENTRY(glTexCoord3f) //112
|
||||
ICD_ENTRY(glTexCoord3fv) //113
|
||||
ICD_ENTRY(glTexCoord3i) //114
|
||||
ICD_ENTRY(glTexCoord3iv) //115
|
||||
ICD_ENTRY(glTexCoord3s) //116
|
||||
ICD_ENTRY(glTexCoord3sv) //117
|
||||
ICD_ENTRY(glTexCoord4d) //118
|
||||
ICD_ENTRY(glTexCoord4dv) //119
|
||||
ICD_ENTRY(glTexCoord4f) //120
|
||||
ICD_ENTRY(glTexCoord4fv) //121
|
||||
ICD_ENTRY(glTexCoord4i) //122
|
||||
ICD_ENTRY(glTexCoord4iv) //123
|
||||
ICD_ENTRY(glTexCoord4s) //124
|
||||
ICD_ENTRY(glTexCoord4sv) //125
|
||||
ICD_ENTRY(glVertex2d) //126
|
||||
ICD_ENTRY(glVertex2dv) //127
|
||||
ICD_ENTRY(glVertex2f) //128
|
||||
ICD_ENTRY(glVertex2fv) //129
|
||||
ICD_ENTRY(glVertex2i) //130
|
||||
ICD_ENTRY(glVertex2iv) //131
|
||||
ICD_ENTRY(glVertex2s) //132
|
||||
ICD_ENTRY(glVertex2sv) //133
|
||||
ICD_ENTRY(glVertex3d) //134
|
||||
ICD_ENTRY(glVertex3dv) //135
|
||||
ICD_ENTRY(glVertex3f) //136
|
||||
ICD_ENTRY(glVertex3fv) //137
|
||||
ICD_ENTRY(glVertex3i) //138
|
||||
ICD_ENTRY(glVertex3iv) //139
|
||||
ICD_ENTRY(glVertex3s) //140
|
||||
ICD_ENTRY(glVertex3sv) //141
|
||||
ICD_ENTRY(glVertex4d) //142
|
||||
ICD_ENTRY(glVertex4dv) //143
|
||||
ICD_ENTRY(glVertex4f) //144
|
||||
ICD_ENTRY(glVertex4fv) //145
|
||||
ICD_ENTRY(glVertex4i) //146
|
||||
ICD_ENTRY(glVertex4iv) //147
|
||||
ICD_ENTRY(glVertex4s) //148
|
||||
ICD_ENTRY(glVertex4sv) //149
|
||||
ICD_ENTRY(glClipPlane) //150
|
||||
ICD_ENTRY(glColorMaterial) //151
|
||||
ICD_ENTRY(glCullFace) //152
|
||||
ICD_ENTRY(glFogf) //153
|
||||
ICD_ENTRY(glFogfv) //154
|
||||
ICD_ENTRY(glFogi) //155
|
||||
ICD_ENTRY(glFogiv) //156
|
||||
ICD_ENTRY(glFrontFace) //157
|
||||
ICD_ENTRY(glHint) //158
|
||||
ICD_ENTRY(glLightf) //159
|
||||
ICD_ENTRY(glLightfv) //160
|
||||
ICD_ENTRY(glLighti) //161
|
||||
ICD_ENTRY(glLightiv) //162
|
||||
ICD_ENTRY(glLightModelf) //163
|
||||
ICD_ENTRY(glLightModelfv) //164
|
||||
ICD_ENTRY(glLightModeli) //165
|
||||
ICD_ENTRY(glLightModeliv) //166
|
||||
ICD_ENTRY(glLineStipple) //167
|
||||
ICD_ENTRY(glLineWidth) //168
|
||||
ICD_ENTRY(glMaterialf) //169
|
||||
ICD_ENTRY(glMaterialfv) //170
|
||||
ICD_ENTRY(glMateriali) //171
|
||||
ICD_ENTRY(glMaterialiv) //172
|
||||
ICD_ENTRY(glPointSize) //173
|
||||
ICD_ENTRY(glPolygonMode) //174
|
||||
ICD_ENTRY(glPolygonStipple) //175
|
||||
ICD_ENTRY(glScissor) //176
|
||||
ICD_ENTRY(glShadeModel) //177
|
||||
ICD_ENTRY(glTexParameterf) //178
|
||||
ICD_ENTRY(glTexParameterfv) //179
|
||||
ICD_ENTRY(glTexParameteri) //180
|
||||
ICD_ENTRY(glTexParameteriv) //181
|
||||
ICD_ENTRY(glTexImage1D) //182
|
||||
ICD_ENTRY(glTexImage2D) //183
|
||||
ICD_ENTRY(glTexEnvf) //184
|
||||
ICD_ENTRY(glTexEnvfv) //185
|
||||
ICD_ENTRY(glTexEnvi) //186
|
||||
ICD_ENTRY(glTexEnviv) //187
|
||||
ICD_ENTRY(glTexGend) //188
|
||||
ICD_ENTRY(glTexGendv) //189
|
||||
ICD_ENTRY(glTexGenf) //190
|
||||
ICD_ENTRY(glTexGenfv) //191
|
||||
ICD_ENTRY(glTexGeni) //192
|
||||
ICD_ENTRY(glTexGeniv) //193
|
||||
ICD_ENTRY(glFeedbackBuffer) //194
|
||||
ICD_ENTRY(glSelectBuffer) //195
|
||||
ICD_ENTRY(glRenderMode) //196
|
||||
ICD_ENTRY(glInitNames) //197
|
||||
ICD_ENTRY(glLoadName) //198
|
||||
ICD_ENTRY(glPassThrough) //199
|
||||
ICD_ENTRY(glPopName) //200
|
||||
ICD_ENTRY(glPushName) //201
|
||||
ICD_ENTRY(glDrawBuffer) //202
|
||||
ICD_ENTRY(glClear) //203
|
||||
ICD_ENTRY(glClearAccum) //204
|
||||
ICD_ENTRY(glClearIndex) //205
|
||||
ICD_ENTRY(glClearColor) //206
|
||||
ICD_ENTRY(glClearStencil) //207
|
||||
ICD_ENTRY(glClearDepth) //208
|
||||
ICD_ENTRY(glStencilMask) //209
|
||||
ICD_ENTRY(glColorMask) //210
|
||||
ICD_ENTRY(glDepthMask) //211
|
||||
ICD_ENTRY(glIndexMask) //212
|
||||
ICD_ENTRY(glAccum) //213
|
||||
ICD_ENTRY(glDisable) //214
|
||||
ICD_ENTRY(glEnable) //215
|
||||
ICD_ENTRY(glFinish) //216
|
||||
ICD_ENTRY(glFlush) //217
|
||||
ICD_ENTRY(glPopAttrib) //218
|
||||
ICD_ENTRY(glPushAttrib) //219
|
||||
ICD_ENTRY(glMap1d) //220
|
||||
ICD_ENTRY(glMap1f) //221
|
||||
ICD_ENTRY(glMap2d) //222
|
||||
ICD_ENTRY(glMap2f) //223
|
||||
ICD_ENTRY(glMapGrid1d) //224
|
||||
ICD_ENTRY(glMapGrid1f) //225
|
||||
ICD_ENTRY(glMapGrid2d) //226
|
||||
ICD_ENTRY(glMapGrid2f) //227
|
||||
ICD_ENTRY(glEvalCoord1d) //228
|
||||
ICD_ENTRY(glEvalCoord1dv) //229
|
||||
ICD_ENTRY(glEvalCoord1f) //230
|
||||
ICD_ENTRY(glEvalCoord1fv) //231
|
||||
ICD_ENTRY(glEvalCoord2d) //232
|
||||
ICD_ENTRY(glEvalCoord2dv) //233
|
||||
ICD_ENTRY(glEvalCoord2f) //234
|
||||
ICD_ENTRY(glEvalCoord2fv) //235
|
||||
ICD_ENTRY(glEvalMesh1) //236
|
||||
ICD_ENTRY(glEvalPoint1) //237
|
||||
ICD_ENTRY(glEvalMesh2) //238
|
||||
ICD_ENTRY(glEvalPoint2) //239
|
||||
ICD_ENTRY(glAlphaFunc) //240
|
||||
ICD_ENTRY(glBlendFunc) //241
|
||||
ICD_ENTRY(glLogicOp) //242
|
||||
ICD_ENTRY(glStencilFunc) //243
|
||||
ICD_ENTRY(glStencilOp) //244
|
||||
ICD_ENTRY(glDepthFunc) //245
|
||||
ICD_ENTRY(glPixelZoom) //246
|
||||
ICD_ENTRY(glPixelTransferf) //247
|
||||
ICD_ENTRY(glPixelTransferi) //248
|
||||
ICD_ENTRY(glPixelStoref) //249
|
||||
ICD_ENTRY(glPixelStorei) //250
|
||||
ICD_ENTRY(glPixelMapfv) //251
|
||||
ICD_ENTRY(glPixelMapuiv) //252
|
||||
ICD_ENTRY(glPixelMapusv) //253
|
||||
ICD_ENTRY(glReadBuffer) //254
|
||||
ICD_ENTRY(glCopyPixels) //255
|
||||
ICD_ENTRY(glReadPixels) //256
|
||||
ICD_ENTRY(glDrawPixels) //257
|
||||
ICD_ENTRY(glGetBooleanv) //258
|
||||
ICD_ENTRY(glGetClipPlane) //259
|
||||
ICD_ENTRY(glGetDoublev) //260
|
||||
ICD_ENTRY(glGetError) //261
|
||||
ICD_ENTRY(glGetFloatv) //262
|
||||
ICD_ENTRY(glGetIntegerv) //263
|
||||
ICD_ENTRY(glGetLightfv) //264
|
||||
ICD_ENTRY(glGetLightiv) //265
|
||||
ICD_ENTRY(glGetMapdv) //266
|
||||
ICD_ENTRY(glGetMapfv) //267
|
||||
ICD_ENTRY(glGetMapiv) //268
|
||||
ICD_ENTRY(glGetMaterialfv) //269
|
||||
ICD_ENTRY(glGetMaterialiv) //270
|
||||
ICD_ENTRY(glGetPixelMapfv) //271
|
||||
ICD_ENTRY(glGetPixelMapuiv) //272
|
||||
ICD_ENTRY(glGetPixelMapusv) //273
|
||||
ICD_ENTRY(glGetPolygonStipple) //274
|
||||
ICD_ENTRY(glGetString) //275
|
||||
ICD_ENTRY(glGetTexEnvfv) //276
|
||||
ICD_ENTRY(glGetTexEnviv) //277
|
||||
ICD_ENTRY(glGetTexGendv) //278
|
||||
ICD_ENTRY(glGetTexGenfv) //279
|
||||
ICD_ENTRY(glGetTexGeniv) //280
|
||||
ICD_ENTRY(glGetTexImage) //281
|
||||
ICD_ENTRY(glGetTexParameterfv) //282
|
||||
ICD_ENTRY(glGetTexParameteriv) //283
|
||||
ICD_ENTRY(glGetTexLevelParameterfv) //284
|
||||
ICD_ENTRY(glGetTexLevelParameteriv) //285
|
||||
ICD_ENTRY(glIsEnabled) //286
|
||||
ICD_ENTRY(glIsList) //287
|
||||
ICD_ENTRY(glDepthRange) //288
|
||||
ICD_ENTRY(glFrustum) //289
|
||||
ICD_ENTRY(glLoadIdentity) //290
|
||||
ICD_ENTRY(glLoadMatrixf) //291
|
||||
ICD_ENTRY(glLoadMatrixd) //292
|
||||
ICD_ENTRY(glMatrixMode) //293
|
||||
ICD_ENTRY(glMultMatrixf) //294
|
||||
ICD_ENTRY(glMultMatrixd) //295
|
||||
ICD_ENTRY(glOrtho) //296
|
||||
ICD_ENTRY(glPopMatrix) //297
|
||||
ICD_ENTRY(glPushMatrix) //298
|
||||
ICD_ENTRY(glRotated) //299
|
||||
ICD_ENTRY(glRotatef) //300
|
||||
ICD_ENTRY(glScaled) //301
|
||||
ICD_ENTRY(glScalef) //302
|
||||
ICD_ENTRY(glTranslated) //303
|
||||
ICD_ENTRY(glTranslatef) //304
|
||||
ICD_ENTRY(glViewport) //305
|
||||
ICD_ENTRY(glArrayElement) //306
|
||||
ICD_ENTRY(glBindTexture) //307
|
||||
ICD_ENTRY(glColorPointer) //308
|
||||
ICD_ENTRY(glDisableClientState) //309
|
||||
ICD_ENTRY(glDrawArrays) //310
|
||||
ICD_ENTRY(glDrawElements) //311
|
||||
ICD_ENTRY(glEdgeFlagPointer) //312
|
||||
ICD_ENTRY(glEnableClientState) //313
|
||||
ICD_ENTRY(glIndexPointer) //314
|
||||
ICD_ENTRY(glIndexub) //315
|
||||
ICD_ENTRY(glIndexubv) //316
|
||||
ICD_ENTRY(glInterleavedArrays) //317
|
||||
ICD_ENTRY(glNormalPointer) //318
|
||||
ICD_ENTRY(glPolygonOffset) //319
|
||||
ICD_ENTRY(glTexCoordPointer) //320
|
||||
ICD_ENTRY(glVertexPointer) //321
|
||||
ICD_ENTRY(glAreTexturesResident) //322
|
||||
ICD_ENTRY(glCopyTexImage1D) //323
|
||||
ICD_ENTRY(glCopyTexImage2D) //324
|
||||
ICD_ENTRY(glCopyTexSubImage1D) //325
|
||||
ICD_ENTRY(glCopyTexSubImage2D) //326
|
||||
ICD_ENTRY(glDeleteTextures) //327
|
||||
ICD_ENTRY(glGenTextures) //328
|
||||
ICD_ENTRY(glGetPointerv) //329
|
||||
ICD_ENTRY(glIsTexture) //330
|
||||
ICD_ENTRY(glPrioritizeTextures) //331
|
||||
ICD_ENTRY(glTexSubImage1D) //332
|
||||
ICD_ENTRY(glTexSubImage2D) //333
|
||||
ICD_ENTRY(glPopClientAttrib) //334
|
||||
ICD_ENTRY(glPushClientAttrib) //335
|
|
@ -1,25 +0,0 @@
|
|||
/* icdtable.h */
|
||||
|
||||
#ifndef OPENGL32_PRIVATE_ICDTABLE_H
|
||||
#define OPENGL32_PRIVATE_ICDTABLE_H
|
||||
|
||||
enum icdoffsets_e
|
||||
{
|
||||
ICDIDX_INVALID = -1,
|
||||
#define ICD_ENTRY(x) ICDIDX_##x,
|
||||
#include "icdlist.h"
|
||||
#undef ICD_ENTRY
|
||||
ICDIDX_COUNT
|
||||
};
|
||||
|
||||
typedef struct tagICDTable
|
||||
{
|
||||
DWORD num_funcs; /*!< Normally 336 (0x150) -- the number of functions in OpenGL 1.1 */
|
||||
PROC dispatch_table[812]; /*!< Table containing \a num_funcs pointers to OpenGL functions */
|
||||
} ICDTable, *PICDTable;
|
||||
|
||||
#define DISPATCH_TABLE_SIZE 812*sizeof(PROC)
|
||||
|
||||
#endif /* OPENGL32_PRIVATE_ICDTABLE_H */
|
||||
|
||||
/* EOF */
|
|
@ -1,625 +0,0 @@
|
|||
/*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
* FILE: lib/opengl32/opengl32.c
|
||||
* PURPOSE: OpenGL32 lib
|
||||
* PROGRAMMER: Anich Gregor (blight), Royce Mitchell III
|
||||
* UPDATE HISTORY:
|
||||
* Feb 1, 2004: Created
|
||||
*/
|
||||
|
||||
#include "opengl32.h"
|
||||
|
||||
/* function prototypes */
|
||||
static void OPENGL32_AppendICD( GLDRIVERDATA *icd );
|
||||
static void OPENGL32_RemoveICD( GLDRIVERDATA *icd );
|
||||
static GLDRIVERDATA *OPENGL32_LoadDriver( LPCWSTR regKey );
|
||||
static DWORD OPENGL32_InitializeDriver( GLDRIVERDATA *icd );
|
||||
static BOOL OPENGL32_UnloadDriver( GLDRIVERDATA *icd );
|
||||
static DWORD OPENGL32_RegGetDriverInfo( LPCWSTR driver, GLDRIVERDATA *icd );
|
||||
|
||||
|
||||
/* global vars */
|
||||
GLPROCESSDATA OPENGL32_processdata;
|
||||
|
||||
|
||||
static BOOL
|
||||
OPENGL32_ThreadAttach( void )
|
||||
{
|
||||
PROC *dispatchTable = NULL;
|
||||
TEB *teb = NULL;
|
||||
|
||||
dispatchTable = (PROC*)HeapAlloc( GetProcessHeap(),
|
||||
HEAP_GENERATE_EXCEPTIONS | HEAP_ZERO_MEMORY,
|
||||
DISPATCH_TABLE_SIZE );
|
||||
if (dispatchTable == NULL)
|
||||
{
|
||||
DBGPRINT( "Error: Couldn't allocate GL dispatch table" );
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
teb = NtCurrentTeb();
|
||||
|
||||
/* initialize dispatch table with empty functions */
|
||||
#define X(func, ret, typeargs, args, icdidx, tebidx, stack) \
|
||||
dispatchTable[icdidx] = (PROC)glEmptyFunc##stack; \
|
||||
if (tebidx >= 0) \
|
||||
teb->glDispatchTable[tebidx] = (PVOID)glEmptyFunc##stack;
|
||||
GLFUNCS_MACRO
|
||||
#undef X
|
||||
|
||||
teb->glTable = dispatchTable;
|
||||
/* At first we have no context */
|
||||
teb->glCurrentRC = NULL;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
OPENGL32_ThreadDetach( void )
|
||||
{
|
||||
TEB* teb = NtCurrentTeb();
|
||||
|
||||
rosglMakeCurrent( NULL, NULL );
|
||||
|
||||
if (teb->glTable != NULL)
|
||||
{
|
||||
if (!HeapFree( GetProcessHeap(), 0, teb->glTable ))
|
||||
{
|
||||
DBGPRINT( "Warning: HeapFree() on dispatch table failed (%d)",
|
||||
GetLastError() );
|
||||
}
|
||||
/* NULL-ify it. Even if something went wrong, it's not a good idea to keep it non NULL */
|
||||
teb->glTable = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static BOOL
|
||||
OPENGL32_ProcessAttach( void )
|
||||
{
|
||||
SECURITY_ATTRIBUTES attrib = { sizeof (SECURITY_ATTRIBUTES), /* nLength */
|
||||
NULL, /* lpSecurityDescriptor */
|
||||
TRUE /* bInheritHandle */ };
|
||||
|
||||
memset( &OPENGL32_processdata, 0, sizeof (OPENGL32_processdata) );
|
||||
|
||||
/* create driver, glrc & dcdata list mutex */
|
||||
OPENGL32_processdata.driver_mutex = CreateMutex( &attrib, FALSE, NULL );
|
||||
if (OPENGL32_processdata.driver_mutex == NULL)
|
||||
{
|
||||
DBGPRINT( "Error: Couldn't create driver_list mutex (%d)",
|
||||
GetLastError() );
|
||||
return FALSE;
|
||||
}
|
||||
OPENGL32_processdata.glrc_mutex = CreateMutex( &attrib, FALSE, NULL );
|
||||
if (OPENGL32_processdata.glrc_mutex == NULL)
|
||||
{
|
||||
DBGPRINT( "Error: Couldn't create glrc_list mutex (%d)",
|
||||
GetLastError() );
|
||||
return FALSE;
|
||||
}
|
||||
OPENGL32_processdata.dcdata_mutex = CreateMutex( &attrib, FALSE, NULL );
|
||||
if (OPENGL32_processdata.dcdata_mutex == NULL)
|
||||
{
|
||||
DBGPRINT( "Error: Couldn't create dcdata_list mutex (%d)",
|
||||
GetLastError() );
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
OPENGL32_ProcessDetach( void )
|
||||
{
|
||||
GLDRIVERDATA *icd, *icd2;
|
||||
GLDCDATA *dcdata, *dcdata2;
|
||||
GLRC *glrc, *glrc2;
|
||||
|
||||
/* free lists */
|
||||
for (dcdata = OPENGL32_processdata.dcdata_list; dcdata != NULL;)
|
||||
{
|
||||
dcdata2 = dcdata;
|
||||
dcdata = dcdata->next;
|
||||
if (!HeapFree( GetProcessHeap(), 0, dcdata2 ))
|
||||
DBGPRINT( "Warning: HeapFree() on DCDATA 0x%08x failed (%d)",
|
||||
dcdata2, GetLastError() );
|
||||
}
|
||||
|
||||
for (glrc = OPENGL32_processdata.glrc_list; glrc != NULL;)
|
||||
{
|
||||
glrc2 = glrc;
|
||||
glrc = glrc->next;
|
||||
if (!HeapFree( GetProcessHeap(), 0, glrc2 ))
|
||||
DBGPRINT( "Warning: HeapFree() on GLRC 0x%08x failed (%d)",
|
||||
glrc2, GetLastError() );
|
||||
}
|
||||
|
||||
for (icd = OPENGL32_processdata.driver_list; icd != NULL;)
|
||||
{
|
||||
icd2 = icd;
|
||||
icd = icd->next;
|
||||
if (!HeapFree( GetProcessHeap(), 0, icd2 ))
|
||||
DBGPRINT( "Warning: HeapFree() on DRIVERDATA 0x%08x failed (%d)",
|
||||
icd2, GetLastError() );
|
||||
}
|
||||
|
||||
/* free mutexes */
|
||||
if (OPENGL32_processdata.driver_mutex != NULL)
|
||||
CloseHandle( OPENGL32_processdata.driver_mutex );
|
||||
if (OPENGL32_processdata.glrc_mutex != NULL)
|
||||
CloseHandle( OPENGL32_processdata.glrc_mutex );
|
||||
if (OPENGL32_processdata.dcdata_mutex != NULL)
|
||||
CloseHandle( OPENGL32_processdata.dcdata_mutex );
|
||||
}
|
||||
|
||||
|
||||
BOOL WINAPI
|
||||
DllMain(HINSTANCE hInstance, DWORD Reason, LPVOID Reserved)
|
||||
{
|
||||
DBGPRINT( "Info: Called!" );
|
||||
switch ( Reason )
|
||||
{
|
||||
/* The DLL is loading due to process
|
||||
* initialization or a call to LoadLibrary.
|
||||
*/
|
||||
case DLL_PROCESS_ATTACH:
|
||||
DBGTRACE( "Process attach" );
|
||||
if (!OPENGL32_ProcessAttach())
|
||||
return FALSE;
|
||||
/* No break: Initialize the index for first thread. */
|
||||
|
||||
/* The attached process creates a new thread. */
|
||||
case DLL_THREAD_ATTACH:
|
||||
DBGTRACE( "Thread attach" );
|
||||
if (!OPENGL32_ThreadAttach())
|
||||
return FALSE;
|
||||
break;
|
||||
|
||||
/* The thread of the attached process terminates. */
|
||||
case DLL_THREAD_DETACH:
|
||||
DBGTRACE( "Thread detach" );
|
||||
/* Release the allocated memory for this thread.*/
|
||||
OPENGL32_ThreadDetach();
|
||||
break;
|
||||
|
||||
/* DLL unload due to process termination or FreeLibrary. */
|
||||
case DLL_PROCESS_DETACH:
|
||||
DBGTRACE( "Process detach" );
|
||||
OPENGL32_ThreadDetach();
|
||||
OPENGL32_ProcessDetach();
|
||||
break;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*! \brief Append ICD to linked list.
|
||||
*
|
||||
* \param icd GLDRIVERDATA to append to list
|
||||
*
|
||||
* \note Only call this when you hold the driver_mutex.
|
||||
*/
|
||||
static void
|
||||
OPENGL32_AppendICD( GLDRIVERDATA *icd )
|
||||
{
|
||||
if (OPENGL32_processdata.driver_list == NULL)
|
||||
OPENGL32_processdata.driver_list = icd;
|
||||
else
|
||||
{
|
||||
GLDRIVERDATA *p = OPENGL32_processdata.driver_list;
|
||||
while (p->next != NULL)
|
||||
p = p->next;
|
||||
p->next = icd;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*! \brief Remove ICD from linked list.
|
||||
*
|
||||
* \param icd GLDRIVERDATA to remove from list
|
||||
*
|
||||
* \note Only call this when you hold the driver_mutex.
|
||||
*/
|
||||
static void
|
||||
OPENGL32_RemoveICD( GLDRIVERDATA *icd )
|
||||
{
|
||||
if (icd == OPENGL32_processdata.driver_list)
|
||||
OPENGL32_processdata.driver_list = icd->next;
|
||||
else
|
||||
{
|
||||
GLDRIVERDATA *p = OPENGL32_processdata.driver_list;
|
||||
while (p != NULL)
|
||||
{
|
||||
if (p->next == icd)
|
||||
{
|
||||
p->next = icd->next;
|
||||
return;
|
||||
}
|
||||
p = p->next;
|
||||
}
|
||||
DBGPRINT( "Error: ICD 0x%08x not found in list!", icd );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*! \brief Load an ICD.
|
||||
*
|
||||
* \param driver Name of installable client driver.
|
||||
*
|
||||
* \return Pointer to an allocated GLDRIVERDATA struct.
|
||||
* \retval NULL Failure.
|
||||
*
|
||||
* \todo Call SetLastError() where appropriate.
|
||||
*/
|
||||
static GLDRIVERDATA *
|
||||
OPENGL32_LoadDriver( LPCWSTR driver )
|
||||
{
|
||||
LONG ret;
|
||||
GLDRIVERDATA *icd;
|
||||
|
||||
DBGPRINT( "Info: Loading driver %ws...", driver );
|
||||
|
||||
/* allocate driver data */
|
||||
icd = (GLDRIVERDATA*)HeapAlloc( GetProcessHeap(),
|
||||
HEAP_GENERATE_EXCEPTIONS | HEAP_ZERO_MEMORY,
|
||||
sizeof (GLDRIVERDATA) );
|
||||
if (icd == NULL)
|
||||
{
|
||||
DBGPRINT( "Error: Couldn't allocate GLDRIVERDATA! (%d)", GetLastError() );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ret = OPENGL32_RegGetDriverInfo( driver, icd );
|
||||
if (ret != ERROR_SUCCESS)
|
||||
{
|
||||
DBGPRINT( "Error: Couldn't query driver information (%d)", ret );
|
||||
if (!HeapFree( GetProcessHeap(), 0, icd ))
|
||||
DBGPRINT( "Error: HeapFree() returned false, error code = %d",
|
||||
GetLastError() );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
DBGPRINT( "Info: Dll = %ws", icd->dll );
|
||||
DBGPRINT( "Info: Version = 0x%08x", icd->version );
|
||||
DBGPRINT( "Info: DriverVersion = 0x%08x", icd->driver_version );
|
||||
DBGPRINT( "Info: Flags = 0x%08x", icd->flags );
|
||||
|
||||
/* load/initialize ICD */
|
||||
ret = OPENGL32_InitializeDriver( icd );
|
||||
if (ret != ERROR_SUCCESS)
|
||||
{
|
||||
DBGPRINT( "Error: Couldnt initialize ICD!" );
|
||||
if (!HeapFree( GetProcessHeap(), 0, icd ))
|
||||
DBGPRINT( "Error: HeapFree() returned false, error code = %d",
|
||||
GetLastError() );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* append ICD to list */
|
||||
OPENGL32_AppendICD( icd );
|
||||
DBGPRINT( "Info: ICD loaded." );
|
||||
|
||||
return icd;
|
||||
}
|
||||
|
||||
|
||||
/*! \brief Initialize a driver (Load DLL and DrvXxx procs)
|
||||
*
|
||||
* \param icd ICD to initialize with the dll, version, driverVersion
|
||||
* and flags already filled.
|
||||
* \return Error code.
|
||||
* \retval ERROR_SUCCESS Success
|
||||
*/
|
||||
#define LOAD_DRV_PROC( icd, proc, required ) \
|
||||
*(char**)&icd->proc = (char*)GetProcAddress( icd->handle, #proc ); \
|
||||
if (required && icd->proc == NULL) { \
|
||||
DBGPRINT( "Error: GetProcAddress(\"%s\") failed!", #proc ); \
|
||||
FreeLibrary( icd->handle ); \
|
||||
return GetLastError(); \
|
||||
}
|
||||
|
||||
static DWORD
|
||||
OPENGL32_InitializeDriver( GLDRIVERDATA *icd )
|
||||
{
|
||||
/* check version */
|
||||
if (icd->version > 2)
|
||||
DBGPRINT( "Warning: ICD version > 2 (%d)", icd->version );
|
||||
|
||||
/* load dll */
|
||||
icd->handle = LoadLibraryW( icd->dll );
|
||||
if (icd->handle == NULL)
|
||||
{
|
||||
DWORD err = GetLastError();
|
||||
DBGPRINT( "Error: Couldn't load DLL! (%d)", err );
|
||||
return err;
|
||||
}
|
||||
|
||||
/* validate version */
|
||||
if (icd->driver_version > 1)
|
||||
{
|
||||
LOAD_DRV_PROC(icd, DrvValidateVersion, FALSE);
|
||||
if (icd->DrvValidateVersion != NULL)
|
||||
{
|
||||
if (!icd->DrvValidateVersion( icd->driver_version ))
|
||||
{
|
||||
DBGPRINT( "Error: DrvValidateVersion failed!" );
|
||||
DBGBREAK();
|
||||
FreeLibrary( icd->handle );
|
||||
return ERROR_INVALID_FUNCTION; /* FIXME: use better error code */
|
||||
}
|
||||
}
|
||||
else
|
||||
DBGPRINT( "Info: DrvValidateVersion not exported by ICD" );
|
||||
}
|
||||
|
||||
/* load DrvXXX procs */
|
||||
LOAD_DRV_PROC(icd, DrvCopyContext, TRUE);
|
||||
LOAD_DRV_PROC(icd, DrvCreateContext, FALSE);
|
||||
LOAD_DRV_PROC(icd, DrvCreateLayerContext, FALSE);
|
||||
LOAD_DRV_PROC(icd, DrvDeleteContext, TRUE);
|
||||
LOAD_DRV_PROC(icd, DrvDescribeLayerPlane, TRUE);
|
||||
LOAD_DRV_PROC(icd, DrvDescribePixelFormat, TRUE);
|
||||
LOAD_DRV_PROC(icd, DrvGetLayerPaletteEntries, TRUE);
|
||||
LOAD_DRV_PROC(icd, DrvGetProcAddress, TRUE);
|
||||
LOAD_DRV_PROC(icd, DrvReleaseContext, TRUE);
|
||||
LOAD_DRV_PROC(icd, DrvRealizeLayerPalette, TRUE);
|
||||
LOAD_DRV_PROC(icd, DrvSetContext, TRUE);
|
||||
LOAD_DRV_PROC(icd, DrvSetLayerPaletteEntries, TRUE);
|
||||
LOAD_DRV_PROC(icd, DrvSetPixelFormat, TRUE);
|
||||
LOAD_DRV_PROC(icd, DrvShareLists, TRUE);
|
||||
LOAD_DRV_PROC(icd, DrvSwapBuffers, TRUE);
|
||||
LOAD_DRV_PROC(icd, DrvSwapLayerBuffers, TRUE);
|
||||
|
||||
/* we require at least one of DrvCreateContext and DrvCreateLayerContext */
|
||||
if (icd->DrvCreateContext == NULL && icd->DrvCreateLayerContext == NULL)
|
||||
{
|
||||
DBGPRINT( "Error: One of DrvCreateContext/DrvCreateLayerContext is required!" );
|
||||
FreeLibrary( icd->handle );
|
||||
return ERROR_INVALID_FUNCTION; /* FIXME: use better error code... */
|
||||
}
|
||||
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/*! \brief Unload ICD.
|
||||
*
|
||||
* \retval TRUE Success.
|
||||
* \retval FALSE Failure.
|
||||
*/
|
||||
static BOOL
|
||||
OPENGL32_UnloadDriver( GLDRIVERDATA *icd )
|
||||
{
|
||||
BOOL allOk = TRUE;
|
||||
|
||||
DBGPRINT( "Info: Unloading driver %ws...", icd->driver_name );
|
||||
if (icd->refcount != 0)
|
||||
DBGPRINT( "Warning: ICD refcount = %d (should be 0)", icd->refcount );
|
||||
|
||||
/* unload dll */
|
||||
if (!FreeLibrary( icd->handle ))
|
||||
{
|
||||
allOk = FALSE;
|
||||
DBGPRINT( "Warning: FreeLibrary on ICD %ws failed! (%d)", icd->dll,
|
||||
GetLastError() );
|
||||
}
|
||||
|
||||
/* free resources */
|
||||
OPENGL32_RemoveICD( icd );
|
||||
if (!HeapFree( GetProcessHeap(), 0, icd ))
|
||||
{
|
||||
allOk = FALSE;
|
||||
DBGPRINT( "Warning: HeapFree() returned FALSE, error code = %d",
|
||||
GetLastError() );
|
||||
}
|
||||
|
||||
return allOk;
|
||||
}
|
||||
|
||||
|
||||
/*! \brief Load ICD (shared ICD data)
|
||||
*
|
||||
* \return Pointer to an allocated GLDRIVERDATA on success.
|
||||
* \retval NULL Failure.
|
||||
*/
|
||||
GLDRIVERDATA *
|
||||
OPENGL32_LoadICD( LPCWSTR driver )
|
||||
{
|
||||
GLDRIVERDATA *icd;
|
||||
|
||||
/* synchronize */
|
||||
if (WaitForSingleObject( OPENGL32_processdata.driver_mutex, INFINITE ) ==
|
||||
WAIT_FAILED)
|
||||
{
|
||||
DBGPRINT( "Error: WaitForSingleObject() failed (%d)", GetLastError() );
|
||||
return NULL; /* FIXME: do we have to expect such an error and handle it? */
|
||||
}
|
||||
|
||||
/* look if ICD is already loaded */
|
||||
for (icd = OPENGL32_processdata.driver_list; icd; icd = icd->next)
|
||||
{
|
||||
if (!_wcsicmp( driver, icd->driver_name )) /* found */
|
||||
{
|
||||
/* release mutex */
|
||||
if (!ReleaseMutex( OPENGL32_processdata.driver_mutex ))
|
||||
DBGPRINT( "Error: ReleaseMutex() failed (%d)", GetLastError() );
|
||||
|
||||
return icd;
|
||||
}
|
||||
}
|
||||
|
||||
/* not found - try to load */
|
||||
icd = OPENGL32_LoadDriver( driver );
|
||||
|
||||
/* release mutex */
|
||||
if (!ReleaseMutex( OPENGL32_processdata.driver_mutex ))
|
||||
DBGPRINT( "Error: ReleaseMutex() failed (%d)", GetLastError() );
|
||||
|
||||
return icd;
|
||||
}
|
||||
|
||||
|
||||
/*! \brief Unload ICD (shared ICD data)
|
||||
*
|
||||
* \retval TRUE Success.
|
||||
* \retval FALSE Failure.
|
||||
*/
|
||||
BOOL
|
||||
OPENGL32_UnloadICD( GLDRIVERDATA *icd )
|
||||
{
|
||||
BOOL ret = TRUE;
|
||||
|
||||
/* synchronize */
|
||||
if (WaitForSingleObject( OPENGL32_processdata.driver_mutex, INFINITE ) ==
|
||||
WAIT_FAILED)
|
||||
{
|
||||
DBGPRINT( "Error: WaitForSingleObject() failed (%d)", GetLastError() );
|
||||
return FALSE; /* FIXME: do we have to expect such an error and handle it? */
|
||||
}
|
||||
|
||||
if (icd->refcount == 0)
|
||||
ret = OPENGL32_UnloadDriver( icd );
|
||||
|
||||
/* release mutex */
|
||||
if (!ReleaseMutex( OPENGL32_processdata.driver_mutex ))
|
||||
DBGPRINT( "Error: ReleaseMutex() failed (%d)", GetLastError() );
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*! \brief Enumerate OpenGLDrivers (from registry)
|
||||
*
|
||||
* \param idx Index of the driver to get information about.
|
||||
* \param name Pointer to an array of WCHARs (can be NULL)
|
||||
* \param cName Pointer to a DWORD. Input is len of name array.
|
||||
* Output is length of the drivername.
|
||||
* Can be NULL if name is NULL.
|
||||
*
|
||||
* \return Error code
|
||||
* \retval ERROR_NO_MORE_ITEMS End of driver list.
|
||||
* \retval ERROR_SUCCESS Success.
|
||||
*/
|
||||
#if 0 /* unused */
|
||||
DWORD
|
||||
OPENGL32_RegEnumDrivers( DWORD idx, LPWSTR name, LPDWORD cName )
|
||||
{
|
||||
HKEY hKey;
|
||||
LPCWSTR subKey = OPENGL_DRIVERS_SUBKEY;
|
||||
LONG ret;
|
||||
DWORD size;
|
||||
WCHAR driver[256];
|
||||
|
||||
if (name == NULL)
|
||||
return ERROR_SUCCESS; /* nothing to do */
|
||||
|
||||
if (cName == NULL)
|
||||
return ERROR_INVALID_FUNCTION; /* we need cName when name is given */
|
||||
|
||||
/* open OpenGLDrivers registry key */
|
||||
ret = RegOpenKeyExW( HKEY_LOCAL_MACHINE, subKey, 0, KEY_READ, &hKey );
|
||||
if (ret != ERROR_SUCCESS)
|
||||
{
|
||||
DBGPRINT( "Error: Couldn't open registry key '%ws'", subKey );
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* get subkey name */
|
||||
size = sizeof (driver) / sizeof (driver[0]);
|
||||
ret = RegEnumKeyW( hKey, idx, name, *cName );
|
||||
if (ret != ERROR_SUCCESS)
|
||||
{
|
||||
DBGPRINT( "Error: Couldn't get OpenGLDrivers subkey name (%d)", ret );
|
||||
RegCloseKey( hKey );
|
||||
return ret;
|
||||
}
|
||||
*cName = wcslen( name );
|
||||
|
||||
/* close key */
|
||||
RegCloseKey( hKey );
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
#endif /* 0 -- unused */
|
||||
|
||||
|
||||
/*! \brief Get registry values for a driver given a name.
|
||||
*
|
||||
* \param driver Name of the driver to get information about.
|
||||
* \param icd Pointer to GLDRIVERDATA.
|
||||
*
|
||||
* \return Error code.
|
||||
* \retval ERROR_SUCCESS Success.
|
||||
*
|
||||
* \note On success the following fields of \a icd are filled: \a driver_name,
|
||||
* \a dll, \a version, \a driver_version and \a flags.
|
||||
*/
|
||||
static DWORD
|
||||
OPENGL32_RegGetDriverInfo( LPCWSTR driver, GLDRIVERDATA *icd )
|
||||
{
|
||||
HKEY hKey;
|
||||
WCHAR subKey[1024] = OPENGL_DRIVERS_SUBKEY2;
|
||||
LONG ret;
|
||||
DWORD type, size;
|
||||
|
||||
/* drivers registry values */
|
||||
DWORD version = 1, driverVersion = 0, flags = 0;
|
||||
WCHAR dll[256];
|
||||
|
||||
/* open driver registry key */
|
||||
wcsncat( subKey, driver, 1024 );
|
||||
ret = RegOpenKeyExW( HKEY_LOCAL_MACHINE, subKey, 0, KEY_READ, &hKey );
|
||||
if (ret != ERROR_SUCCESS)
|
||||
{
|
||||
DBGPRINT( "Error: Couldn't open registry key '%ws'", subKey );
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* query values */
|
||||
size = sizeof (dll);
|
||||
ret = RegQueryValueExW( hKey, L"Dll", 0, &type, (LPBYTE)dll, &size );
|
||||
if (ret != ERROR_SUCCESS || type != REG_SZ)
|
||||
{
|
||||
DBGPRINT( "Error: Couldn't query Dll value or not a string" );
|
||||
RegCloseKey( hKey );
|
||||
return ret;
|
||||
}
|
||||
|
||||
size = sizeof (DWORD);
|
||||
ret = RegQueryValueExW( hKey, L"Version", 0, &type, (LPBYTE)&version, &size );
|
||||
if (ret != ERROR_SUCCESS || type != REG_DWORD)
|
||||
DBGPRINT( "Warning: Couldn't query Version value or not a DWORD" );
|
||||
|
||||
size = sizeof (DWORD);
|
||||
ret = RegQueryValueExW( hKey, L"DriverVersion", 0, &type,
|
||||
(LPBYTE)&driverVersion, &size );
|
||||
if (ret != ERROR_SUCCESS || type != REG_DWORD)
|
||||
DBGPRINT( "Warning: Couldn't query DriverVersion value or not a DWORD" );
|
||||
|
||||
size = sizeof (DWORD);
|
||||
ret = RegQueryValueExW( hKey, L"Flags", 0, &type, (LPBYTE)&flags, &size );
|
||||
if (ret != ERROR_SUCCESS || type != REG_DWORD)
|
||||
DBGPRINT( "Warning: Couldn't query Flags value or not a DWORD" );
|
||||
|
||||
/* close key */
|
||||
RegCloseKey( hKey );
|
||||
|
||||
/* output data */
|
||||
/* FIXME: NUL-terminate strings? */
|
||||
wcsncpy( icd->driver_name, driver,
|
||||
sizeof (icd->driver_name) / sizeof (icd->driver_name[0]) - 1 );
|
||||
wcsncpy( icd->dll, dll,
|
||||
sizeof (icd->dll) / sizeof (icd->dll[0]) );
|
||||
icd->version = version;
|
||||
icd->driver_version = driverVersion;
|
||||
icd->flags = flags;
|
||||
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
|
|
@ -1,181 +0,0 @@
|
|||
# Microsoft Developer Studio Project File - Name="opengl32" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
|
||||
|
||||
CFG=opengl32 - Win32 Debug
|
||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||
!MESSAGE use the Export Makefile command and run
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "opengl32.mak".
|
||||
!MESSAGE
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "opengl32.mak" CFG="opengl32 - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "opengl32 - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
|
||||
!MESSAGE "opengl32 - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
# PROP Scc_ProjName ""
|
||||
# PROP Scc_LocalPath ""
|
||||
CPP=cl.exe
|
||||
MTL=midl.exe
|
||||
RSC=rc.exe
|
||||
|
||||
!IF "$(CFG)" == "opengl32 - Win32 Release"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "Release"
|
||||
# PROP BASE Intermediate_Dir "Release"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "Release"
|
||||
# PROP Intermediate_Dir "Release"
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "OPENGL32_EXPORTS" /YX /FD /c
|
||||
# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "OPENGL32_EXPORTS" /YX /FD /c
|
||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
||||
# ADD RSC /l 0x409 /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
|
||||
|
||||
!ELSEIF "$(CFG)" == "opengl32 - Win32 Debug"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir "Debug"
|
||||
# PROP BASE Intermediate_Dir "Debug"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "Debug"
|
||||
# PROP Intermediate_Dir "Debug"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "OPENGL32_EXPORTS" /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "OPENGL32_EXPORTS" /YX /FD /TP /GZ /c
|
||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 gdi32.lib advapi32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
# Name "opengl32 - Win32 Release"
|
||||
# Name "opengl32 - Win32 Debug"
|
||||
# Begin Group "Source Files"
|
||||
|
||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\gl.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\opengl32.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\tebimports.asm
|
||||
|
||||
!IF "$(CFG)" == "opengl32 - Win32 Release"
|
||||
|
||||
# Begin Custom Build - Compiling $(InputPath)
|
||||
IntDir=.\Release
|
||||
InputPath=.\tebimports.asm
|
||||
InputName=tebimports
|
||||
|
||||
"$(IntDir)/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
||||
nasmw.exe -f win32 $(InputPath) -o "$(IntDir)/$(InputName).obj"
|
||||
|
||||
# End Custom Build
|
||||
|
||||
!ELSEIF "$(CFG)" == "opengl32 - Win32 Debug"
|
||||
|
||||
# Begin Custom Build - Compiling $(InputPath)
|
||||
IntDir=.\Debug
|
||||
InputPath=.\tebimports.asm
|
||||
InputName=tebimports
|
||||
|
||||
"$(IntDir)/$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
||||
nasmw.exe -f win32 -d win32 $(InputPath) -o "$(IntDir)/$(InputName).obj"
|
||||
|
||||
# End Custom Build
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\wgl.c
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Header Files"
|
||||
|
||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\glfuncs.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\icdlist.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\icdtable.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\opengl32.def
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\opengl32.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\slowlist.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\teb.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\teblist.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\teblist.mac
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Resource Files"
|
||||
|
||||
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
||||
# End Group
|
||||
# End Target
|
||||
# End Project
|
|
@ -1,29 +0,0 @@
|
|||
Microsoft Developer Studio Workspace File, Format Version 6.00
|
||||
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "opengl32"=.\opengl32.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Global:
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<3>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue