⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stubs.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
字号:
/* GGI-Driver for MESA *  * Copyright (C) 1997  Uwe Maurer * * 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. * --------------------------------------------------------------------- * This code was derived from the following source of information: * * svgamesa.c and ddsample.c by Brian Paul *  */#include <stdio.h>#include <ggi/internal/ggi-dl.h>#include <ggi/mesa/ggimesa_int.h>#include <ggi/mesa/debug.h>#include "swrast/swrast.h"//#include "swrast_setup/swrast_setup.h"//#include "swrast/s_context.h"//#include "swrast/s_depth.h"//#include "swrast/s_triangle.h"#define FLIP(coord) (LIBGGI_MODE(ggi_ctx->ggi_visual)->visible.y-(coord)-1)/**********************************************************************//*****            Write spans of pixels                           *****//**********************************************************************/void GGIwrite_ci32_span(const GLcontext *ctx,                         GLuint n, GLint x, GLint y,                         const GLuint ci[],                         const GLubyte mask[] ){	ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;	y = FLIP(y);	if (mask)	{		while (n--) {			if (*mask++)				ggiPutPixel(ggi_ctx->ggi_visual, x, y, *ci);			x++;			ci++;		}	}	else	{		while (n--)			ggiPutPixel(ggi_ctx->ggi_visual, x++, y, *ci++);	}}void GGIwrite_ci8_span(const GLcontext *ctx,                         GLuint n, GLint x, GLint y,                         const GLubyte ci[],                         const GLubyte mask[] ){	ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;	y = FLIP(y);	if (mask)	{		while (n--) {			if (*mask++)				ggiPutPixel(ggi_ctx->ggi_visual, x, y, *ci);			x++;			ci++;		}	}	else	{		while (n--)			ggiPutPixel(ggi_ctx->ggi_visual, x++, y, *ci++);	}}void GGIwrite_mono_ci_span(const GLcontext *ctx, GLuint n, GLint x, GLint y,			   const GLuint ci, const GLubyte mask[]){	ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;	y = FLIP(y);	if (mask)	{		while (n--) {			if (*mask++)				ggiPutPixel(ggi_ctx->ggi_visual, x, y, ci);			x++;		}	}	else	{		while (n--)			ggiPutPixel(ggi_ctx->ggi_visual, x++, y, ci);	}}void GGIwrite_mono_rgba_span(const GLcontext *ctx, GLuint n, GLint x, GLint y,			     const GLchan rgba[4], const GLubyte mask[]){	ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;	ggi_color rgb;	ggi_pixel col;		y = FLIP(y);	rgb.r = (uint16)(rgba[RCOMP]) << SHIFT;	rgb.g = (uint16)(rgba[GCOMP]) << SHIFT;	rgb.b = (uint16)(rgba[BCOMP]) << SHIFT;	col = ggiMapColor(ggi_ctx->ggi_visual, &rgb);	if (mask)	{		while (n--) {			if (*mask++)				ggiPutPixel(ggi_ctx->ggi_visual, x, y, col);			x++;		}	}	else	{		ggiDrawHLine(ggi_ctx->ggi_visual, x, y, n);	}}void GGIwrite_rgba_span( const GLcontext *ctx,                          GLuint n, GLint x, GLint y,                          const GLubyte rgba[][4],                          const GLubyte mask[]){	ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;	ggi_color rgb;	ggi_pixel col;		y = FLIP(y);	if (mask)	{		while (n--) {			if (*mask++) 			{				rgb.r = (uint16)(rgba[0][RCOMP]) << SHIFT;				rgb.g = (uint16)(rgba[0][GCOMP]) << SHIFT;				rgb.b = (uint16)(rgba[0][BCOMP]) << SHIFT;				col = ggiMapColor(ggi_ctx->ggi_visual, &rgb);				ggiPutPixel(ggi_ctx->ggi_visual, x, y, col);			}			x++;			rgba++;		}	}	else	{		while (n--)		{			rgb.r = (uint16)(rgba[0][RCOMP]) << SHIFT;			rgb.g = (uint16)(rgba[0][GCOMP]) << SHIFT;			rgb.b = (uint16)(rgba[0][BCOMP]) << SHIFT;			col = ggiMapColor(ggi_ctx->ggi_visual, &rgb);			ggiPutPixel(ggi_ctx->ggi_visual, x++, y, col);			rgba++;		}	}}void GGIwrite_rgb_span( const GLcontext *ctx,                          GLuint n, GLint x, GLint y,                          const GLubyte rgba[][3],                          const GLubyte mask[] ){	ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;	ggi_color rgb;	ggi_pixel col;		y = FLIP(y);	if (mask)	{		while (n--) {			if (*mask++) 			{				rgb.r = (uint16)(rgba[0][RCOMP]) << SHIFT;				rgb.g = (uint16)(rgba[0][GCOMP]) << SHIFT;				rgb.b = (uint16)(rgba[0][BCOMP]) << SHIFT;				col = ggiMapColor(ggi_ctx->ggi_visual, &rgb);				ggiPutPixel(ggi_ctx->ggi_visual, x, y, col);			}			x++;			rgba++;		}	}	else	{		while (n--)		{			rgb.r = (uint16)(rgba[0][RCOMP]) << SHIFT;			rgb.g = (uint16)(rgba[0][GCOMP]) << SHIFT;			rgb.b = (uint16)(rgba[0][BCOMP]) << SHIFT;			col = ggiMapColor(ggi_ctx->ggi_visual, &rgb);			ggiPutPixel(ggi_ctx->ggi_visual, x++, y, col);			rgba++;		}	}}/**********************************************************************//*****                 Read spans of pixels                       *****//**********************************************************************/void GGIread_ci32_span( const GLcontext *ctx,                         GLuint n, GLint x, GLint y, GLuint ci[]){	ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;	y = FLIP(y);	while (n--)		ggiGetPixel(ggi_ctx->ggi_visual, x++, y, ci++);}void GGIread_rgba_span( const GLcontext *ctx,                         GLuint n, GLint x, GLint y,                         GLubyte rgba[][4]){	ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;	ggi_color rgb;	ggi_pixel col;	y = FLIP(y);	while (n--)	{		ggiGetPixel(ggi_ctx->ggi_visual, x++, y, &col);		ggiUnmapPixel(ggi_ctx->ggi_visual, col, &rgb);		rgba[0][RCOMP] = (GLubyte) (rgb.r >> SHIFT);		rgba[0][GCOMP] = (GLubyte) (rgb.g >> SHIFT);		rgba[0][BCOMP] = (GLubyte) (rgb.b >> SHIFT);		rgba[0][ACOMP] = 0;		rgba++;	}}/**********************************************************************//*****                  Write arrays of pixels                    *****//**********************************************************************/void GGIwrite_ci32_pixels( const GLcontext *ctx,                            GLuint n, const GLint x[], const GLint y[],                            const GLuint ci[], const GLubyte mask[] ){	ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;	while (n--) {		if (*mask++)			ggiPutPixel(ggi_ctx->ggi_visual, *x, FLIP(*y), *ci);		ci++;		x++;		y++;	}}void GGIwrite_mono_ci_pixels(const GLcontext *ctx,			     GLuint n, const GLint x[], const GLint y[],			     GLuint ci, const GLubyte mask[]){	ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;	while (n--) {		if (*mask++)			ggiPutPixel(ggi_ctx->ggi_visual, *x, FLIP(*y), ci);		x++;		y++;	}}void GGIwrite_rgba_pixels( const GLcontext *ctx,                            GLuint n, const GLint x[], const GLint y[],                            const GLubyte rgba[][4],                            const GLubyte mask[] ){	ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;	ggi_pixel col;	ggi_color rgb;	while (n--) {		if (*mask++) {			rgb.r = (uint16)(rgba[0][RCOMP]) << SHIFT;			rgb.g = (uint16)(rgba[0][GCOMP]) << SHIFT;			rgb.b = (uint16)(rgba[0][BCOMP]) << SHIFT;			col = ggiMapColor(ggi_ctx->ggi_visual, &rgb);			ggiPutPixel(ggi_ctx->ggi_visual, *x, FLIP(*y), col);		}		x++;		y++;		rgba++;	}}void GGIwrite_mono_rgba_pixels(const GLcontext *ctx,			       GLuint n, const GLint x[], const GLint y[],			       const GLchan rgba[4], const GLubyte mask[]){	ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;	ggi_color rgb;	ggi_pixel col;		rgb.r = (uint16)(rgba[RCOMP]) << SHIFT;	rgb.g = (uint16)(rgba[GCOMP]) << SHIFT;	rgb.b = (uint16)(rgba[BCOMP]) << SHIFT;	col = ggiMapColor(ggi_ctx->ggi_visual, &rgb);		while (n--) {		if (*mask++)			ggiPutPixel(ggi_ctx->ggi_visual, *x, FLIP(*y), col);		x++;		y++;	}}/**********************************************************************//*****                   Read arrays of pixels                    *****//**********************************************************************/void GGIread_ci32_pixels( const GLcontext *ctx,                           GLuint n, const GLint x[], const GLint y[],                           GLuint ci[], const GLubyte mask[]){	ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;	while (n--) {		if (*mask++) 			ggiGetPixel(ggi_ctx->ggi_visual, *x, FLIP(*y), ci);		ci++;		x++;		y++;	}}void GGIread_rgba_pixels( const GLcontext *ctx,                           GLuint n, const GLint x[], const GLint y[],                           GLubyte rgba[][4],                           const GLubyte mask[] ){	ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;	ggi_color rgb;	ggi_pixel col;	while (n--)	{		if (*mask++)		{			ggiGetPixel(ggi_ctx->ggi_visual, *x, FLIP(*y), &col);			ggiUnmapPixel(ggi_ctx->ggi_visual, col, &rgb);			rgba[0][RCOMP] = rgb.r >> SHIFT; 			rgba[0][GCOMP] = rgb.g >> SHIFT;			rgba[0][BCOMP] = rgb.b >> SHIFT;			rgba[0][ACOMP] = 0;		}			x++;		y++;		rgba++;	}}int GGIextend_visual(ggi_visual_t vis){	return 0;}//static swrast_tri_func ggimesa_stubs_get_triangle_func(GLcontext *ctx);int GGIsetup_driver(ggi_mesa_context_t ggi_ctx){	struct swrast_device_driver *swdd =		_swrast_GetDeviceDriverReference(ggi_ctx->gl_ctx);	GGIMESADPRINT_CORE("stubs: setup_driver\n");		swdd->WriteRGBASpan	= GGIwrite_rgba_span;	swdd->WriteRGBSpan	= GGIwrite_rgb_span;	swdd->WriteMonoRGBASpan = GGIwrite_mono_rgba_span;	swdd->WriteRGBAPixels   = GGIwrite_rgba_pixels;	swdd->WriteMonoRGBAPixels = GGIwrite_mono_rgba_pixels;	swdd->WriteCI32Span     = GGIwrite_ci32_span;	swdd->WriteCI8Span      = GGIwrite_ci8_span;	swdd->WriteMonoCISpan	= GGIwrite_mono_ci_span;	swdd->WriteCI32Pixels   = GGIwrite_ci32_pixels;	swdd->WriteMonoCIPixels = GGIwrite_mono_ci_pixels;	swdd->ReadCI32Span 	= GGIread_ci32_span;	swdd->ReadRGBASpan	= GGIread_rgba_span;	swdd->ReadCI32Pixels	= GGIread_ci32_pixels;	swdd->ReadRGBAPixels	= GGIread_rgba_pixels;		return 0;}void GGIupdate_state(ggi_mesa_context_t *ctx){	//ctx->Driver.TriangleFunc = _swsetup_Triangle;}/*void GGItriangle_flat(GLcontext *ctx, const SWvertex *v0, const SWvertex *v1, const SWvertex *v2){//#define INTERP_Z 1#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE	  	#define SETUP_CODE	       	\	ggi_color color;	\	color.r = v0->color[0];	\	color.g = v0->color[1];	\	color.b = v0->color[2];	\	color.a = v0->color[3];	\	ggiSetGCForeground(VIS, ggiMapColor(VIS, &color));#define INNER_LOOP(LEFT,RIGHT,Y)				\		ggiDrawHLine(VIS,LEFT,FLIP(Y),RIGHT-LEFT);			#include "swrast/s_tritemp.h"}static void GGItriangle_flat_depth(GLcontext *ctx, const SWvertex *v0, const SWvertex *v1, const SWvertex *v2){#define INTERP_Z 1#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE#define SETUP_CODE	       	\	ggi_color color;	\	color.r = v0->color[0];	\	color.g = v0->color[1];	\	color.b = v0->color[2];	\	color.a = v0->color[3];	\	ggiSetGCForeground(VIS, ggiMapColor(VIS, &color));	#define INNER_LOOP(LEFT,RIGHT,Y)					\	{								\	GLint i,xx=LEFT,yy=FLIP(Y),n=RIGHT-LEFT,length=0;		\	GLint startx=xx;						\	for (i=0;i<n;i++){						\		GLdepth z=FixedToDepth(ffz);				\		if (z<zRow[i])						\		{							\			zRow[i]=z;					\			length++;					\		}							\		else							\		{							\			if (length)					\			{ 						\				ggiDrawHLine(VIS,startx,yy,length);	\				length=0;				\			}						\			startx=xx+i+1;					\		}							\		ffz+=fdzdx;						\	}								\	if (length) ggiDrawHLine(VIS,startx,yy,length);			\	}#include "swrast/s_tritemp.h"}static swrast_tri_func ggimesa_stubs_get_triangle_func(GLcontext *ctx){	if (ctx->Stencil.Enabled) return NULL;	if (ctx->Polygon.SmoothFlag) return NULL;	if (ctx->Polygon.StippleFlag) return NULL;	if (ctx->Texture._ReallyEnabled) return NULL;  	if (ctx->Light.ShadeModel==GL_SMOOTH) return NULL;	if (ctx->Depth.Test && ctx->Depth.Func != GL_LESS) return NULL;	if (ctx->Depth.Test) 	  return GGItriangle_flat_depth;	return GGItriangle_flat;	}*/static int GGIopen(ggi_visual_t vis, struct ggi_dlhandle *dlh,			const char *args, void *argptr, uint32 *dlret){       	LIBGGI_MESAEXT(vis)->update_state = GGIupdate_state;	LIBGGI_MESAEXT(vis)->setup_driver = GGIsetup_driver;	*dlret = GGI_DL_OPDRAW;	return 0;}int MesaGGIdl_stubs(int func, void **funcptr){	switch (func) {	case GGIFUNC_open:		*funcptr = GGIopen;		return 0;	case GGIFUNC_exit:	case GGIFUNC_close:		*funcptr = NULL;		return 0;	default:		*funcptr = NULL;	}	return GGI_ENOTFOUND;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -