osmesa.c revision 74b493a5e61237de081a438e774e5d8139d4c6b7
174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul/* $Id: osmesa.c,v 1.41 2001/01/24 00:04:58 brianp Exp $ */
2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
3afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
4afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Mesa 3-D graphics library
574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * Version:  3.5
6dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen *
774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
8dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen *
9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Permission is hereby granted, free of charge, to any person obtaining a
10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * copy of this software and associated documentation files (the "Software"),
11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * to deal in the Software without restriction, including without limitation
12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * and/or sell copies of the Software, and to permit persons to whom the
14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Software is furnished to do so, subject to the following conditions:
15dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen *
16afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * The above copyright notice and this permission notice shall be included
17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * in all copies or substantial portions of the Software.
18dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen *
19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
26afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
27afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
28afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
29afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Off-Screen Mesa rendering / Rendering into client memory space
30d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul *
31d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * Note on thread safety:  this driver is thread safe.  All
32d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * functions are reentrant.  The notion of current context is
33b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul * managed by the core _mesa_make_current() and _mesa_get_current_context()
34d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul * functions.  Those functions are thread-safe.
35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
36afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
37afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
38afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef PC_HEADER
39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "all.h"
40afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
41eed6f691991ed0d64752fa712c83f67eb700b9adBrian Paul#include "glheader.h"
42afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "GL/osmesa.h"
43afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "context.h"
4474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#include "colormac.h"
45afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "depth.h"
46ebb248aa5c018dc676d389221d76ed329059789eBrian Paul#include "macros.h"
47cb5ecb883eb3be842ef44c61df8d4b527877c858Brian Paul#include "mem.h"
48afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "matrix.h"
493041d05bbcccfddba01a1eeaba01e5da0e1e99afBrian Paul#include "mmath.h"
50dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen#include "mtypes.h"
5123ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank#include "extensions.h"
521e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/swrast.h"
531e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast_setup/swrast_setup.h"
541e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_context.h"
55724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_depth.h"
561e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_lines.h"
571e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell#include "swrast/s_triangle.h"
585a9026c65d260dc185e072163999f5d810015108Brian Paul#include "tnl/tnl.h"
5958e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell#include "array_cache/acache.h"
60afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
61afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
62afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
63724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell
64724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell
65304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul/*
66304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * This is the OS/Mesa context struct.
67304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * Notice how it includes a GLcontext.  By doing this we're mimicking
68304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * C++ inheritance/derivation.
69304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * Later, we can cast a GLcontext pointer into an OSMesaContext pointer
70304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul * or vice versa.
71304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul */
72afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstruct osmesa_context {
73304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul   GLcontext gl_ctx;		/* The core GL/Mesa context */
74afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLvisual *gl_visual;		/* Describes the buffers */
75afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLframebuffer *gl_buffer;	/* Depth, stencil, accum, etc buffers */
76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLenum format;		/* either GL_RGBA or GL_COLOR_INDEX */
77afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   void *buffer;		/* the image buffer */
78afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint width, height;		/* size of image buffer */
79afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint rowlength;		/* number of pixels per row */
80afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint userRowLength;		/* user-specified number of pixels per row */
81afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint rshift, gshift;	/* bit shifts for RGBA formats */
82afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint bshift, ashift;
8374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLint rInd, gInd, bInd, aInd;/* index offsets for RGBA formats */
8474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *rowaddr[MAX_HEIGHT];	/* address of first pixel in each image row */
85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean yup;		/* TRUE  -> Y increases upward */
86afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg				/* FALSE -> Y increases downward */
87afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg};
88afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
89afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
90afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
91afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* A forward declaration: */
92cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstatic void osmesa_update_state( GLcontext *ctx, GLuint newstate );
931e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_register_swrast_functions( GLcontext *ctx );
94afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
95afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
96afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
97c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul#define OSMESA_CONTEXT(ctx)  ((OSMesaContext) (ctx->DriverCtx))
98c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul
99c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul
100c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul
101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*****                    Public Functions                        *****/
103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Create an Off-Screen Mesa rendering context.  The only attribute needed is
108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * an RGBA vs Color-Index mode flag.
109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input:  format - either GL_RGBA or GL_COLOR_INDEX
111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         sharelist - specifies another OSMesaContext with which to share
112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *                     display lists.  NULL indicates no sharing.
113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return:  an OSMesaContext or 0 if error
114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
115d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian PaulOSMesaContext GLAPIENTRY
116d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian PaulOSMesaCreateContext( GLenum format, OSMesaContext sharelist )
117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1182bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul   return OSMesaCreateContextExt(format, DEFAULT_SOFTWARE_DEPTH_BITS,
1192bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                 8, 16, sharelist);
1202bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul}
1212bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
1222bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
1232bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
1242bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul/*
1252bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul * New in Mesa 3.5
1262bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul *
1272bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul * Create context and specify size of ancillary buffers.
1282bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul */
1292bf5d9470d3232763cb49b5589209940d4d5398dBrian PaulOSMesaContext GLAPIENTRY
1302bf5d9470d3232763cb49b5589209940d4d5398dBrian PaulOSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits,
1312bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                        GLint accumBits, OSMesaContext sharelist )
1322bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul{
133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   OSMesaContext osmesa;
134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint rshift, gshift, bshift, ashift;
13574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLint rind, gind, bind, aind;
1362bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul   GLint indexBits, redBits, greenBits, blueBits, alphaBits;
137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean rgbmode;
138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean swalpha;
13974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLuint i4 = 1;
14074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLubyte *i1 = (GLubyte *) &i4;
14174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint little_endian = *i1;
142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   swalpha = GL_FALSE;
14474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   rind = gind = bind = aind = 0;
145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (format==OSMESA_COLOR_INDEX) {
146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      indexBits = 8;
147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rshift = gshift = bshift = ashift = 0;
148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgbmode = GL_FALSE;
149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (format==OSMESA_RGBA) {
151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      indexBits = 0;
1522bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul      redBits = 8;
1532bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul      greenBits = 8;
1542bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul      blueBits = 8;
155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      alphaBits = 8;
15674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rind = 0;
15774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      gind = 1;
15874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      bind = 2;
15974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      aind = 3;
160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (little_endian) {
161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rshift = 0;
162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         gshift = 8;
163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         bshift = 16;
164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ashift = 24;
165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rshift = 24;
168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         gshift = 16;
169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         bshift = 8;
170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ashift = 0;
171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgbmode = GL_TRUE;
173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (format==OSMESA_BGRA) {
175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      indexBits = 0;
1762bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul      redBits = 8;
1772bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul      greenBits = 8;
1782bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul      blueBits = 8;
179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      alphaBits = 8;
18074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rind = 2;
18174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      gind = 1;
18274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      bind = 0;
18374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      aind = 3;
184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (little_endian) {
185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ashift = 0;
186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rshift = 8;
187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         gshift = 16;
188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         bshift = 24;
189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         bshift = 24;
192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         gshift = 16;
193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rshift = 8;
194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ashift = 0;
195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgbmode = GL_TRUE;
197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (format==OSMESA_ARGB) {
199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      indexBits = 0;
2002bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul      redBits = 8;
2012bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul      greenBits = 8;
2022bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul      blueBits = 8;
203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      alphaBits = 8;
20474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rind = 1;
20574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      gind = 2;
20674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      bind = 3;
20774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      aind = 0;
208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (little_endian) {
209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         bshift = 0;
210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         gshift = 8;
211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rshift = 16;
212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ashift = 24;
213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ashift = 24;
216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         rshift = 16;
217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         gshift = 8;
218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         bshift = 0;
219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgbmode = GL_TRUE;
221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (format==OSMESA_RGB) {
223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      indexBits = 0;
2242bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul      redBits = 8;
2252bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul      greenBits = 8;
2262bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul      blueBits = 8;
227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      alphaBits = 0;
228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      bshift = 0;
229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      gshift = 8;
230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rshift = 16;
231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ashift = 24;
232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rind = 0;
23374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      gind = 1;
23474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      bind = 2;
235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgbmode = GL_TRUE;
236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      swalpha = GL_TRUE;
237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (format==OSMESA_BGR) {
239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      indexBits = 0;
2402bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul      redBits = 8;
2412bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul      greenBits = 8;
2422bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul      blueBits = 8;
243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      alphaBits = 0;
244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      bshift = 0;
245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      gshift = 8;
246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rshift = 16;
247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ashift = 24;
248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rind = 2;
24974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      gind = 1;
25074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      bind = 0;
251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      rgbmode = GL_TRUE;
252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      swalpha = GL_TRUE;
253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return NULL;
256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
259bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul   osmesa = (OSMesaContext) CALLOC_STRUCT(osmesa_context);
260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (osmesa) {
2612bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul      osmesa->gl_visual = _mesa_create_visual( rgbmode,
2622bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               GL_FALSE,    /* double buffer */
2632bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               GL_FALSE,    /* stereo */
2642bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               redBits,
2652bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               greenBits,
2662bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               blueBits,
2672bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               alphaBits,
2682bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               indexBits,
2692bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               depthBits,
2702bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               stencilBits,
2712bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               accumBits,
2722bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               accumBits,
2732bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               accumBits,
2742bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               alphaBits ? accumBits : 0,
2752bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               1            /* num samples */
2762bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul                                               );
277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (!osmesa->gl_visual) {
278941dcc797e1a6317808c1ec43476817286d576baBrian Paul         FREE(osmesa);
279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return NULL;
280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
282df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul      if (!_mesa_initialize_context(&osmesa->gl_ctx,
283df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul                                    osmesa->gl_visual,
284df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul                                    sharelist ? &sharelist->gl_ctx
285df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul                                              : (GLcontext *) NULL,
286df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul                                    (void *) osmesa, GL_TRUE )) {
287df81387dfae199a71bc55138ea5856dc05eacf24Brian Paul         _mesa_destroy_visual( osmesa->gl_visual );
288bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul         FREE(osmesa);
289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return NULL;
290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
2915a9026c65d260dc185e072163999f5d810015108Brian Paul
2925a9026c65d260dc185e072163999f5d810015108Brian Paul      _mesa_enable_sw_extensions(&(osmesa->gl_ctx));
293304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul
294b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      osmesa->gl_buffer = _mesa_create_framebuffer( osmesa->gl_visual,
295b6bcae5698df88f7730d40004ce7ce0462e97a20Brian Paul                                          osmesa->gl_visual->depthBits > 0,
296b6bcae5698df88f7730d40004ce7ce0462e97a20Brian Paul                                          osmesa->gl_visual->stencilBits > 0,
297b6bcae5698df88f7730d40004ce7ce0462e97a20Brian Paul                                          osmesa->gl_visual->accumRedBits > 0,
298b6bcae5698df88f7730d40004ce7ce0462e97a20Brian Paul                                          osmesa->gl_visual->alphaBits > 0 );
2994c44d63f01a01f134d7e4456d4209edee97f9ef5Brian Paul
300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (!osmesa->gl_buffer) {
301b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul         _mesa_destroy_visual( osmesa->gl_visual );
302b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul         _mesa_free_context_data( &osmesa->gl_ctx );
303bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul         FREE(osmesa);
304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return NULL;
305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->format = format;
307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->buffer = NULL;
308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->width = 0;
309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->height = 0;
310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->userRowLength = 0;
311afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->rowlength = 0;
312afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->yup = GL_TRUE;
313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->rshift = rshift;
314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->gshift = gshift;
315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->bshift = bshift;
316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      osmesa->ashift = ashift;
31774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      osmesa->rInd = rind;
31874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      osmesa->gInd = gind;
31974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      osmesa->bInd = bind;
32074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      osmesa->aInd = aind;
3211e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
3221e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
3231e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell      /* Initialize the software rasterizer and helper modules.
3241e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell       */
3251e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell      {
3261e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell	 GLcontext *ctx = &osmesa->gl_ctx;
3271e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
3281e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell	 _swrast_CreateContext( ctx );
32958e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell	 _ac_CreateContext( ctx );
33023caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell	 _tnl_CreateContext( ctx );
331cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 _swsetup_CreateContext( ctx );
332dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen
3331e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell	 osmesa_register_swrast_functions( ctx );
3341e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell      }
335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
336afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return osmesa;
337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
3412bf5d9470d3232763cb49b5589209940d4d5398dBrian Paul
342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Destroy an Off-Screen Mesa rendering context.
344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input:  ctx - the context to destroy
346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid GLAPIENTRY OSMesaDestroyContext( OSMesaContext ctx )
348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx) {
350b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      _mesa_destroy_visual( ctx->gl_visual );
351b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      _mesa_destroy_framebuffer( ctx->gl_buffer );
352b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul      _mesa_free_context_data( &ctx->gl_ctx );
353bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul      FREE( ctx );
354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Recompute the values of the context's rowaddr array.
361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void compute_row_addresses( OSMesaContext ctx )
363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
36474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLint bytesPerPixel, bytesPerRow, i;
36574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLubyte *origin = (GLubyte *) ctx->buffer;
36674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
36774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->format == OSMESA_COLOR_INDEX) {
36874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      /* CI mode */
36974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      bytesPerPixel = 1 * sizeof(GLchan);
37074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
37174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   else if ((ctx->format == OSMESA_RGB) || (ctx->format == OSMESA_BGR)) {
37274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      /* RGB mode */
37374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      bytesPerPixel = 3 * sizeof(GLchan);
37474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
37574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   else {
37674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      /* RGBA mode */
37774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      bytesPerPixel = 4 * sizeof(GLchan);
37874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
37974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
38074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   bytesPerRow = ctx->rowlength * bytesPerPixel;
381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx->yup) {
383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* Y=0 is bottom line of window */
38474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < MAX_HEIGHT; i++) {
38574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         ctx->rowaddr[i] = (GLchan *) ((GLubyte *) origin + i * bytesPerRow);
386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* Y=0 is top line of window */
39074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < MAX_HEIGHT; i++) {
39174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLint j = ctx->height - i - 1;
39274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         ctx->rowaddr[i] = (GLchan *) ((GLubyte *) origin + j * bytesPerRow);
393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
394afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Bind an OSMesaContext to an image buffer.  The image buffer is just a
400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * block of memory which the client provides.  Its size must be at least
401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * as large as width*height*sizeof(type).  Its address should be a multiple
402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * of 4 if using RGBA mode.
403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Image data is stored in the order of glDrawPixels:  row-major order
405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * with the lower-left image pixel stored in the first array position
406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * (ie. bottom-to-top).
407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Since the only type initially supported is GL_UNSIGNED_BYTE, if the
409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * context is in RGBA mode, each pixel will be stored as a 4-byte RGBA
410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * value.  If the context is in color indexed mode, each pixel will be
411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * stored as a 1-byte value.
412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * If the context's viewport hasn't been initialized yet, it will now be
414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * initialized to (0,0,width,height).
415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input:  ctx - the rendering context
417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         buffer - the image buffer memory
418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         type - data type for pixel components, only GL_UNSIGNED_BYTE
419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *                supported now
420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *         width, height - size of image buffer in pixels, at least 1
421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return:  GL_TRUE if success, GL_FALSE if error because of invalid ctx,
422afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *          invalid buffer address, type!=GL_UNSIGNED_BYTE, width<1, height<1,
423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *          width>internal limit or height>internal limit.
424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
425d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian PaulGLboolean GLAPIENTRY
426d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian PaulOSMesaMakeCurrent( OSMesaContext ctx, void *buffer, GLenum type,
427d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul                   GLsizei width, GLsizei height )
428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
42974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (!ctx || !buffer || type != CHAN_TYPE ||
43074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       width < 1 || height < 1 ||
43174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       width > MAX_WIDTH || height > MAX_HEIGHT) {
432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return GL_FALSE;
433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
435cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   osmesa_update_state( &ctx->gl_ctx, 0 );
436b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul   _mesa_make_current( &ctx->gl_ctx, ctx->gl_buffer );
437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->buffer = buffer;
439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->width = width;
440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->height = height;
441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx->userRowLength)
442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->rowlength = ctx->userRowLength;
443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else
444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->rowlength = width;
445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   compute_row_addresses( ctx );
447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* init viewport */
449304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul   if (ctx->gl_ctx.Viewport.Width==0) {
450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* initialize viewport and scissor box to buffer size */
451cb5ecb883eb3be842ef44c61df8d4b527877c858Brian Paul      _mesa_Viewport( 0, 0, width, height );
452304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul      ctx->gl_ctx.Scissor.Width = width;
453304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul      ctx->gl_ctx.Scissor.Height = height;
454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return GL_TRUE;
457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgOSMesaContext GLAPIENTRY OSMesaGetCurrentContext( void )
462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
463b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul   GLcontext *ctx = _mesa_get_current_context();
464d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul   if (ctx)
465304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul      return (OSMesaContext) ctx;
466d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul   else
467d3c070ca6a36daa765b1ad7f44e03e6671ad0490Brian Paul      return NULL;
468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid GLAPIENTRY OSMesaPixelStore( GLint pname, GLint value )
473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   OSMesaContext ctx = OSMesaGetCurrentContext();
475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (pname) {
477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_ROW_LENGTH:
478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (value<0) {
479304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul            gl_error( &ctx->gl_ctx, GL_INVALID_VALUE,
480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                      "OSMesaPixelStore(value)" );
481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            return;
482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctx->userRowLength = value;
484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctx->rowlength = value;
485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_Y_UP:
487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctx->yup = value ? GL_TRUE : GL_FALSE;
488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
490304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul         gl_error( &ctx->gl_ctx, GL_INVALID_ENUM, "OSMesaPixelStore(pname)" );
491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   compute_row_addresses( ctx );
495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgvoid GLAPIENTRY OSMesaGetIntegerv( GLint pname, GLint *value )
499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   OSMesaContext ctx = OSMesaGetCurrentContext();
501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (pname) {
503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_WIDTH:
504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *value = ctx->width;
505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_HEIGHT:
507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *value = ctx->height;
508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_FORMAT:
510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *value = ctx->format;
511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_TYPE:
513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *value = GL_UNSIGNED_BYTE;
514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_ROW_LENGTH:
516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *value = ctx->rowlength;
517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case OSMESA_Y_UP:
519afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         *value = ctx->yup;
520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
522304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul         gl_error(&ctx->gl_ctx, GL_INVALID_ENUM, "OSMesaGetIntergerv(pname)");
523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
527afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return the depth buffer associated with an OSMesa context.
529afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input:  c - the OSMesa context
530afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Output:  width, height - size of buffer in pixels
531afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *          bytesPerValue - bytes per depth value (2 or 4)
532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *          buffer - pointer to depth buffer values
533afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
534afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
5357e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulGLboolean GLAPIENTRY
5367e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulOSMesaGetDepthBuffer( OSMesaContext c, GLint *width, GLint *height,
5377e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul                      GLint *bytesPerValue, void **buffer )
538afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
539650cb74bcb913d2589355d56a14da1ab0307d1fcBrian Paul   if ((!c->gl_buffer) || (!c->gl_buffer->DepthBuffer)) {
540afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      *width = 0;
541afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      *height = 0;
542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      *bytesPerValue = 0;
543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      *buffer = 0;
544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return GL_FALSE;
545afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
546afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
547afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      *width = c->gl_buffer->Width;
548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      *height = c->gl_buffer->Height;
549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      *bytesPerValue = sizeof(GLdepth);
550650cb74bcb913d2589355d56a14da1ab0307d1fcBrian Paul      *buffer = c->gl_buffer->DepthBuffer;
551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return GL_TRUE;
552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
554afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
55523ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank/*
55623ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Return the color buffer associated with an OSMesa context.
55723ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Input:  c - the OSMesa context
55823ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Output:  width, height - size of buffer in pixels
55923ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *          format - the pixel format (OSMESA_FORMAT)
56023ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank *          buffer - pointer to color buffer values
56123ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
56223ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank */
5637e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulGLboolean GLAPIENTRY
5647e67fb41fb54e050f6983b4de09ed3a317d6148fBrian PaulOSMesaGetColorBuffer( OSMesaContext c, GLint *width,
5657e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul                      GLint *height, GLint *format, void **buffer )
56623ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank{
56723ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank   if (!c->buffer) {
56823ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *width = 0;
56923ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *height = 0;
57023ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *format = 0;
57123ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *buffer = 0;
57223ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      return GL_FALSE;
5737e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul   }
5747e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul   else {
57523ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *width = c->width;
57623ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *height = c->height;
57723ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *format = c->format;
57823ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      *buffer = c->buffer;
57923ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank      return GL_TRUE;
58023ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank   }
58123ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank}
582afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
583afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
584afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*** Device Driver Functions                                        ***/
585afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
586afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
587afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
588afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
589afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Useful macros:
590afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
591afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
59274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PACK_RGBA(DST, R, G, B, A)	\
59374b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo {					\
59474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[osmesa->rInd] = R;		\
59574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[osmesa->gInd] = G;		\
59674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[osmesa->bInd] = B;		\
59774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[osmesa->aInd] = A;		\
59874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0)
59974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
60074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PACK_RGB(DST, R, G, B)  \
60174b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo {				\
60274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[0] = R;		\
60374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[1] = G;		\
60474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[2] = B;		\
60574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0)
606afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
60774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PACK_BGR(DST, R, G, B)  \
60874b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo {				\
60974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[0] = B;		\
61074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[1] = G;		\
61174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (DST)[2] = R;		\
61274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0)
613afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
614afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
61574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define UNPACK_RED(P)      ( ((GLchan *) &(P))[osmesa->rInd] )
61674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define UNPACK_GREEN(P)    ( ((GLchan *) &(P))[osmesa->gInd] )
61774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define UNPACK_BLUE(P)     ( ((GLchan *) &(P))[osmesa->bInd] )
61874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define UNPACK_ALPHA(P)    ( ((GLchan *) &(P))[osmesa->aInd] )
61974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
62074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
62174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PIXELADDR1(X,Y)  (osmesa->rowaddr[Y] + (X))
62274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PIXELADDR3(X,Y)  (osmesa->rowaddr[Y] + 3 * (X))
62374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PIXELADDR4(X,Y)  (osmesa->rowaddr[Y] + 4 * (X))
624afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
625afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
626afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
627cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paulstatic GLboolean set_draw_buffer( GLcontext *ctx, GLenum mode )
628afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
629afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) ctx;
630afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mode==GL_FRONT_LEFT) {
631afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return GL_TRUE;
632afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
633afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
634afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return GL_FALSE;
635afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
636afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
637afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
638afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
639cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paulstatic void set_read_buffer( GLcontext *ctx, GLframebuffer *buffer, GLenum mode )
640cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul{
641cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul   /* separate read buffer not supported */
642cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul   ASSERT(buffer == ctx->DrawBuffer);
643cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul   ASSERT(mode == GL_FRONT_LEFT);
644cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul}
645cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul
646cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul
647afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic GLbitfield clear( GLcontext *ctx, GLbitfield mask, GLboolean all,
648afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                         GLint x, GLint y, GLint width, GLint height )
649afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
650c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
651dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul   const GLuint *colorMask = (GLuint *) &ctx->Color.ColorMask;
652dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul
653dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul   /* we can't handle color or index masking */
654dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul   if (*colorMask != 0xffffffff || ctx->Color.IndexMask != 0xffffffff)
655dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul      return mask;
656dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul
657dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul   /* sanity check - we only have a front-left buffer */
658dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul   ASSERT((mask & (DD_FRONT_RIGHT_BIT | DD_BACK_LEFT_BIT | DD_BACK_RIGHT_BIT)) == 0);
659dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul
660dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul   if (mask & DD_FRONT_LEFT_BIT) {
66174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      if (osmesa->format == OSMESA_COLOR_INDEX) {
662afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (all) {
663afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* Clear whole CI buffer */
66474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#if CHAN_TYPE == GL_UNSIGNED_BYTE
66574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            MEMSET(osmesa->buffer, ctx->Color.ClearIndex,
666afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                   osmesa->rowlength * osmesa->height);
66774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#else
66874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            const GLint n = osmesa->rowlength * osmesa->height;
66974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            GLchan *buffer = (GLchan *) osmesa->buffer;
67074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            GLint i;
67174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            for (i = 0; i < n; i ++) {
67274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul               buffer[i] = ctx->Color.ClearIndex;
67374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            }
67474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#endif
675afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
676afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         else {
677afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* Clear part of CI buffer */
67874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            const GLchan clearIndex = (GLchan) ctx->Color.ClearIndex;
679afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            GLint i, j;
68074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            for (i = 0; i < height; i++) {
68174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul               GLchan *ptr1 = PIXELADDR1(x, (y + i));
68274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul               for (j = 0; j < width; j++) {
68374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                  *ptr1++ = clearIndex;
684afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               }
685afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
686afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
687afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
68874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      else if (osmesa->format == OSMESA_RGB) {
68974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         const GLchan r = ctx->Color.ClearColor[0];
69074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         const GLchan g = ctx->Color.ClearColor[1];
69174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         const GLchan b = ctx->Color.ClearColor[2];
692afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (all) {
693afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* Clear whole RGB buffer */
69474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            GLuint n = osmesa->rowlength * osmesa->height;
69574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            GLchan *ptr3 = (GLchan *) osmesa->buffer;
69674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            GLuint i;
69774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            for (i = 0; i < n; i++) {
69874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul               PACK_RGB(ptr3, r, g, b);
699afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               ptr3 += 3;
700afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
701afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
702afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         else {
703afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* Clear part of RGB buffer */
704afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            GLint i, j;
70574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            for (i = 0; i < height; i++) {
70674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul               GLchan *ptr3 = PIXELADDR3(x, (y + i));
70774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul               for (j = 0; j < width; j++) {
70874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                  PACK_RGB(ptr3, r, g, b);
70974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                  ptr3 += 3;
71074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul               }
71174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            }
71274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         }
71374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
71474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      else if (osmesa->format == OSMESA_BGR) {
71574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         const GLchan r = ctx->Color.ClearColor[0];
71674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         const GLchan g = ctx->Color.ClearColor[1];
71774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         const GLchan b = ctx->Color.ClearColor[2];
71874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         if (all) {
71974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            /* Clear whole RGB buffer */
72074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            const GLint n = osmesa->rowlength * osmesa->height;
72174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            GLchan *ptr3 = (GLchan *) osmesa->buffer;
72274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            GLint i;
72374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            for (i = 0; i < n; i++) {
72474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul               PACK_BGR(ptr3, r, g, b);
72574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul               ptr3 += 3;
72674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            }
72774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         }
72874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         else {
72974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            /* Clear part of RGB buffer */
73074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            GLint i, j;
73174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            for (i = 0; i < height; i++) {
73274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul               GLchan *ptr3 = PIXELADDR3(x, (y + i));
73374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul               for (j = 0; j < width; j++) {
73474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                  PACK_BGR(ptr3, r, g, b);
735afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg                  ptr3 += 3;
736afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               }
737afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
738afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
739afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
740afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
74174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#if CHAN_TYPE == GL_UNSIGNED_BYTE
74274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         /* 4-byte pixel value */
74374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLuint clearPixel;
74474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLchan *clr = (GLchan *) &clearPixel;
74574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         clr[osmesa->rInd] = ctx->Color.ClearColor[0];
74674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         clr[osmesa->gInd] = ctx->Color.ClearColor[1];
74774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         clr[osmesa->bInd] = ctx->Color.ClearColor[2];
74874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         clr[osmesa->aInd] = ctx->Color.ClearColor[3];
749afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (all) {
750afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* Clear whole RGBA buffer */
75174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            const GLuint n = osmesa->rowlength * osmesa->height;
75274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            GLuint *ptr4 = (GLuint *) osmesa->buffer;
75374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            GLuint i;
75474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            if (clearPixel) {
75574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul               for (i = 0; i < n; i++) {
75674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                  *ptr4++ = clearPixel;
757941dcc797e1a6317808c1ec43476817286d576baBrian Paul               }
758941dcc797e1a6317808c1ec43476817286d576baBrian Paul            }
759941dcc797e1a6317808c1ec43476817286d576baBrian Paul            else {
760941dcc797e1a6317808c1ec43476817286d576baBrian Paul               BZERO(ptr4, n * sizeof(GLuint));
761afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
762afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
763afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         else {
764afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            /* Clear part of RGBA buffer */
765afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            GLint i, j;
76674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            for (i = 0; i < height; i++) {
76774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul               GLuint *ptr4 = (GLuint *) PIXELADDR4(x, (y + i));
76874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul               for (j = 0; j < width; j++) {
76974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                  *ptr4++ = clearPixel;
77074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul               }
77174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            }
77274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         }
77374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#else
77474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         const GLchan r = ctx->Color.ClearColor[0];
77574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         const GLchan g = ctx->Color.ClearColor[1];
77674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         const GLchan b = ctx->Color.ClearColor[2];
77774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         const GLchan a = ctx->Color.ClearColor[3];
77874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         if (all) {
77974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            /* Clear whole RGBA buffer */
78074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            const GLuint n = osmesa->rowlength * osmesa->height;
78174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            GLchan *p = (GLchan *) osmesa->buffer;
78274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            GLuint i;
78374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            for (i = 0; i < n; i++) {
78474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul               PACK_RGBA(p, r, g, b, a);
78574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul               p += 4;
78674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            }
78774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         }
78874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         else {
78974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            /* Clear part of RGBA buffer */
79074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            GLint i, j;
79174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            for (i = 0; i < height; i++) {
79274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul               GLchan *p = PIXELADDR4(x, (y + i));
79374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul               for (j = 0; j < width; j++) {
79474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                  PACK_RGBA(p, r, g, b, a);
79574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                  p += 4;
796afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg               }
797afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            }
798afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
79974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
80074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#endif
801afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
802afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
803dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul   /* have Mesa clear all other buffers */
804dd020f13a6d520b46aefd4453dae6b6edcc427f6Brian Paul   return mask & (~DD_FRONT_LEFT_BIT);
805afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
806afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
807afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic void buffer_size( GLcontext *ctx, GLuint *width, GLuint *height )
810afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
811c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
812afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   *width = osmesa->width;
813afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   *height = osmesa->height;
814afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
815afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
816afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
817afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
818afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*****        Read/write spans/arrays of RGBA pixels              *****/
819afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
820afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
821afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write RGBA pixels to an RGBA (or permuted) buffer. */
82274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
82374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_span( const GLcontext *ctx, GLuint n, GLint x, GLint y,
82474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                 CONST GLchan rgba[][4], const GLubyte mask[] )
825afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
82674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
82774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR4(x, y);
828afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
829afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mask) {
83074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 4) {
831afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (mask[i]) {
83274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            PACK_RGBA(p, rgba[i][RCOMP], rgba[i][GCOMP],
83374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                         rgba[i][BCOMP], rgba[i][ACOMP]);
834afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
835afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
836afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
837afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
83874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 4) {
83974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGBA(p, rgba[i][RCOMP], rgba[i][GCOMP],
84074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                      rgba[i][BCOMP], rgba[i][ACOMP]);
841afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
842afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
843afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
844afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
845afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
846afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write RGBA pixels to an RGBA buffer.  This is the fastest span-writer. */
84774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
84874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_span_rgba( const GLcontext *ctx, GLuint n, GLint x, GLint y,
84974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                      CONST GLchan rgba[][4], const GLubyte mask[] )
850afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
851c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
85274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLuint *ptr4 = (GLuint *) PIXELADDR4(x, y);
853afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   const GLuint *rgba4 = (const GLuint *) rgba;
854afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
85574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   ASSERT(CHAN_TYPE == GL_UNSIGNED_BYTE);
856afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mask) {
85774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++) {
858afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (mask[i]) {
859afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg            ptr4[i] = rgba4[i];
860afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
861afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
862afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
863afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
864afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      MEMCPY( ptr4, rgba4, n * 4 );
865afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
866afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
867afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
868afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
869afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write RGB pixels to an RGBA (or permuted) buffer. */
87074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
87174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgb_span( const GLcontext *ctx, GLuint n, GLint x, GLint y,
87274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                CONST GLchan rgb[][3], const GLubyte mask[] )
873afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
87474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
87574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR4(x, y);
876afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
877afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mask) {
87874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p+=4) {
879afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (mask[i]) {
88074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            PACK_RGBA(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP], 255);
881afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
882afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
883afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
884afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
88574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p+=4) {
88674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGBA(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP], 255);
887afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
889afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
890afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
891afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
892afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
89374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
89474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_span( const GLcontext *ctx, GLuint n, GLint x, GLint y,
89574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                      const GLchan color[4], const GLubyte mask[] )
896afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
897c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
89874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR4(x, y);
899afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
90074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++, p += 4) {
901afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
90274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGBA(p, color[RCOMP], color[GCOMP], color[BCOMP], color[ACOMP]);
903afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
904afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
905afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
906afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
907afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
908afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
90974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
91074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_pixels( const GLcontext *ctx, GLuint n,
91174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                   const GLint x[], const GLint y[],
91274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                   CONST GLchan rgba[][4], const GLubyte mask[] )
913afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
91474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
915afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
91674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++) {
917afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
91874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLchan *p = PIXELADDR4(x[i], y[i]);
91974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGBA(p, rgba[i][RCOMP], rgba[i][GCOMP],
92074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                      rgba[i][BCOMP], rgba[i][ACOMP]);
921afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
922afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
923afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
924afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
925afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
926afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
92774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
92874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_pixels( const GLcontext *ctx, GLuint n,
92974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                        const GLint x[], const GLint y[],
93074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                        const GLchan color[4], const GLubyte mask[] )
931afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
93274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
933afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
93474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++) {
935afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
93674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLchan *p = PIXELADDR4(x[i], y[i]);
93774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGBA(p, color[RCOMP], color[GCOMP], color[BCOMP], color[ACOMP]);
938afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
939afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
940afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
941afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
942afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
94374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
94474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_span( const GLcontext *ctx, GLuint n, GLint x, GLint y,
94574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                GLchan rgba[][4] )
946afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
94774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
948afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
94974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR4(x, y);
95074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++, p += 4) {
95174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rgba[i][RCOMP] = UNPACK_RED(p);
95274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rgba[i][GCOMP] = UNPACK_GREEN(p);
95374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rgba[i][BCOMP] = UNPACK_BLUE(p);
95474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rgba[i][ACOMP] = UNPACK_ALPHA(p);
955afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
956afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
957afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
958afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
959afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Read RGBA pixels from an RGBA buffer */
96074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
96174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_span_rgba( const GLcontext *ctx, GLuint n, GLint x, GLint y,
96274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                     GLchan rgba[][4] )
963afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
964c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
96574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLuint *ptr4 = (GLuint *) PIXELADDR4(x, y);
9669499e017b7e05411a32b3e4fa94885eaec0d7277Brian Paul   MEMCPY( rgba, ptr4, n * 4 * sizeof(GLchan) );
967afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
968afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
969afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
97074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
97174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_pixels( const GLcontext *ctx,
97274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                  GLuint n, const GLint x[], const GLint y[],
97374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                  GLchan rgba[][4], const GLubyte mask[] )
974afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
97574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
976afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
97774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++) {
978afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
97974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         const GLchan *p = PIXELADDR4(x[i], y[i]);
98074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         rgba[i][RCOMP] = UNPACK_RED(p);
98174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         rgba[i][GCOMP] = UNPACK_GREEN(p);
98274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         rgba[i][BCOMP] = UNPACK_BLUE(p);
98374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         rgba[i][ACOMP] = UNPACK_ALPHA(p);
984afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
985afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
986afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
987afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
988afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
989afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*****                3 byte RGB pixel support funcs              *****/
990afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
991afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
99274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul/* Write RGBA pixels to an RGB buffer. */
99374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
99474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_span_RGB( const GLcontext *ctx, GLuint n, GLint x, GLint y,
99574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                     CONST GLchan rgba[][4], const GLubyte mask[] )
996afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
99774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
99874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR3(x, y);
999afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1000afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mask) {
100174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 3) {
1002afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (mask[i]) {
100374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            PACK_RGB(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
1004afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1005afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1006afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1007afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
100874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 3) {
100974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGB(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
1010afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1011afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1012afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1013afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
101474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul/* Write RGBA pixels to an BGR buffer. */
101574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
101674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_span_BGR( const GLcontext *ctx, GLuint n, GLint x, GLint y,
101774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                     CONST GLchan rgba[][4], const GLubyte mask[] )
1018afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1019c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
102074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR3(x, y);
1021afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1022afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mask) {
102374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 3) {
1024afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (mask[i]) {
102574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            PACK_BGR(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
1026afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1027afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1028afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1029afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
103074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 3) {
103174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_BGR(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
1032afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1033afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1034afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1035afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
103674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul/* Write RGB pixels to an RGB buffer. */
103774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
103874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgb_span_RGB( const GLcontext *ctx, GLuint n, GLint x, GLint y,
103974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                    CONST GLchan rgb[][3], const GLubyte mask[] )
104074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{
104174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
104274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR3(x, y);
104374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLuint i;
104474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (mask) {
104574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 3) {
104674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         if (mask[i]) {
104774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            PACK_RGB(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]);
104874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         }
104974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
105074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
105174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   else {
105274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 3) {
105374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGB(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]);
105474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
105574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
105674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul}
1057afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
105874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul/* Write RGB pixels to an BGR buffer. */
105974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
106074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgb_span_BGR( const GLcontext *ctx, GLuint n, GLint x, GLint y,
106174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                    CONST GLchan rgb[][3], const GLubyte mask[] )
1062afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1063c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
106474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR3(x, y);
1065afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
106674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (mask) {
106774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 3) {
106874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         if (mask[i]) {
106974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            PACK_BGR(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]);
107074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         }
107174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
107274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
107374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   else {
107474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      for (i = 0; i < n; i++, p += 3) {
107574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_BGR(p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]);
107674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
107774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
107874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul}
107974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
108074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
108174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
108274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_span_RGB( const GLcontext *ctx, GLuint n, GLint x, GLint y,
108374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                          const GLchan color[4], const GLubyte mask[] )
108474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{
108574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
108674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR3(x, y);
108774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLuint i;
108874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++, p += 3) {
108974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      if (mask[i]) {
109074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGB(p, color[RCOMP], color[GCOMP], color[BCOMP]);
109174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
109274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
109374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul}
109474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
109574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
109674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_span_BGR( const GLcontext *ctx, GLuint n, GLint x, GLint y,
109774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                          const GLchan color[4], const GLubyte mask[] )
109874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{
109974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
110074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR3(x, y);
110174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLuint i;
110274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++, p += 3) {
1103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
110474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_BGR(p, color[RCOMP], color[GCOMP], color[BCOMP]);
1105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
110974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
111074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_pixels_RGB( const GLcontext *ctx, GLuint n,
111174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                       const GLint x[], const GLint y[],
111274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                       CONST GLchan rgba[][4], const GLubyte mask[] )
1113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1114c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const OSMesaContext osmesa = (const OSMesaContext) ctx;
1115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
111674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++) {
111774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      if (mask[i]) {
111874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLchan *p = PIXELADDR3(x[i], y[i]);
111974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGB(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
112074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
112174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
112274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul}
112374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
112474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
112574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_rgba_pixels_BGR( const GLcontext *ctx, GLuint n,
112674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                       const GLint x[], const GLint y[],
112774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                       CONST GLchan rgba[][4], const GLubyte mask[] )
112874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{
112974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = (const OSMesaContext) ctx;
113074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLuint i;
113174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++) {
1132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
113374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLchan *p = PIXELADDR3(x[i], y[i]);
113474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_BGR(p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
1135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
113974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
114074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_pixels_RGB( const GLcontext *ctx,
114174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                            GLuint n, const GLint x[], const GLint y[],
114274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                            const GLchan color[4], const GLubyte mask[] )
1143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1144c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
114674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++) {
1147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
114874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLchan *p = PIXELADDR3(x[i], y[i]);
114974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGB(p, color[RCOMP], color[GCOMP], color[BCOMP]);
1150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
115474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
115574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monocolor_pixels_BGR( const GLcontext *ctx,
115674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                            GLuint n, const GLint x[], const GLint y[],
115774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                            const GLchan color[4], const GLubyte mask[] )
1158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
115974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
116074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLuint i;
116174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++) {
116274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      if (mask[i]) {
116374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLchan *p = PIXELADDR3(x[i], y[i]);
116474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_BGR(p, color[RCOMP], color[GCOMP], color[BCOMP]);
116574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
116674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
116774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul}
116874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
116974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
117074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_span3( const GLcontext *ctx, GLuint n, GLint x, GLint y,
117174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                 GLchan rgba[][4] )
117274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{
117374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
117574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLchan *p = PIXELADDR3(x, y);
117674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++, p += 3) {
117774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rgba[i][RCOMP] = UNPACK_RED(p);
117874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rgba[i][GCOMP] = UNPACK_GREEN(p);
117974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rgba[i][BCOMP] = UNPACK_BLUE(p);
118074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      rgba[i][ACOMP] = 255;
1181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
118474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
118574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_rgba_pixels3( const GLcontext *ctx,
118674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                   GLuint n, const GLint x[], const GLint y[],
118774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                   GLchan rgba[][4], const GLubyte mask[] )
1188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
118974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
119174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < n; i++) {
1192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
119374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         const GLchan *p = PIXELADDR3(x[i], y[i]);
119474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         rgba[i][RCOMP] = UNPACK_RED(p);
119574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         rgba[i][GCOMP] = UNPACK_GREEN(p);
119674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         rgba[i][BCOMP] = UNPACK_BLUE(p);
119774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         rgba[i][ACOMP] = 255;
1198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*****        Read/write spans/arrays of CI pixels                *****/
1205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write 32-bit color index to buffer */
120874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
120974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_index32_span( const GLcontext *ctx, GLuint n, GLint x, GLint y,
121074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                    const GLuint index[], const GLubyte mask[] )
1211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
121274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
121374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *ptr1 = PIXELADDR1(x, y);
1214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mask) {
1216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      for (i=0;i<n;i++,ptr1++) {
1217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (mask[i]) {
121874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            *ptr1 = (GLchan) index[i];
1219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
1223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      for (i=0;i<n;i++,ptr1++) {
122474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         *ptr1 = (GLchan) index[i];
1225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Write 8-bit color index to buffer */
123174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
123274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_index8_span( const GLcontext *ctx, GLuint n, GLint x, GLint y,
123374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                   const GLubyte index[], const GLubyte mask[] )
1234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
123574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
123674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *ptr1 = PIXELADDR1(x, y);
1237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mask) {
1239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      for (i=0;i<n;i++,ptr1++) {
1240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         if (mask[i]) {
124174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul            *ptr1 = (GLchan) index[i];
1242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         }
1243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
124674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      MEMCPY(ptr1, index, n * sizeof(GLchan));
1247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
125174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
125274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monoindex_span( const GLcontext *ctx, GLuint n, GLint x, GLint y,
125374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                      GLuint colorIndex, const GLubyte mask[] )
1254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
125574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
125674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *ptr1 = PIXELADDR1(x, y);
1257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<n;i++,ptr1++) {
1259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
126074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         *ptr1 = (GLchan) colorIndex;
1261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
126674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
126774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_index_pixels( const GLcontext *ctx,
126874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                    GLuint n, const GLint x[], const GLint y[],
126974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                    const GLuint index[], const GLubyte mask[] )
1270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
127174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<n;i++) {
1274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
127574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLchan *ptr1 = PIXELADDR1(x[i], y[i]);
127674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         *ptr1 = (GLchan) index[i];
1277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
128274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
128374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulwrite_monoindex_pixels( const GLcontext *ctx,
128474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                        GLuint n, const GLint x[], const GLint y[],
128574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                        GLuint colorIndex, const GLubyte mask[] )
1286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
128774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<n;i++) {
1290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i]) {
129174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         GLchan *ptr1 = PIXELADDR1(x[i], y[i]);
129274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         *ptr1 = (GLchan) colorIndex;
1293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
129874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
129974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_index_span( const GLcontext *ctx,
130074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                 GLuint n, GLint x, GLint y, GLuint index[] )
1301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
130274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
130474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLchan *ptr1 = (const GLchan *) PIXELADDR1(x, y);
1305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<n;i++,ptr1++) {
1306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      index[i] = (GLuint) *ptr1;
1307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
131174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
131274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulread_index_pixels( const GLcontext *ctx,
131374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                   GLuint n, const GLint x[], const GLint y[],
131474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                   GLuint index[], const GLubyte mask[] )
1315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
131674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1317afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLuint i;
1318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   for (i=0;i<n;i++) {
1319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (mask[i] ) {
132074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         const GLchan *ptr1 = PIXELADDR1(x[i], y[i]);
1321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         index[i] = (GLuint) *ptr1;
1322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1323afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*****                   Optimized line rendering                 *****/
1330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, RGB line into an osmesa buffer.
1335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
133674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
133774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_rgba_line( GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1 )
1338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
133974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
134074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLchan *color = vert0->color;
1341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1
1343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1
134474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PLOT(X, Y)						\
134574b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo {								\
134674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *p = PIXELADDR4(X, Y);				\
134774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   PACK_RGBA(p, color[0], color[1], color[2], color[3]);	\
134874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0)
1349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32
1351724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h"
1352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
1353724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h"
1354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, Z-less, RGB line into an osmesa buffer.
1360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
136174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
136274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_rgba_z_line(GLcontext *ctx, const SWvertex *vert0, const SWvertex *vert1)
1363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
136474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
136574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLchan *color = vert0->color;
1366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1
1368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1
1369ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
1370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1
137174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define PLOT(X, Y)					\
137274b493a5e61237de081a438e774e5d8139d4c6b7Brian Pauldo {							\
137374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (Z < *zPtr) {					\
137474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      GLchan *p = PIXELADDR4(X, Y);			\
137574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      PACK_RGBA(p, color[RCOMP], color[GCOMP],		\
137674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                   color[BCOMP], color[ACOMP]);		\
137774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      *zPtr = Z;					\
137874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }							\
137974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul} while (0)
138074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
1381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32
1383724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h"
1384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
1385724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h"
1386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, alpha-blended, RGB line into an osmesa buffer.
139274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * XXX update for GLchan
1393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
139474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
139574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_blend_rgba_line( GLcontext *ctx,
139674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                      const SWvertex *vert0, const SWvertex *vert1 )
1397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
139874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
139974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint rshift = osmesa->rshift;
140074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint gshift = osmesa->gshift;
140174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint bshift = osmesa->bshift;
140274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint avalue = vert0->color[3];
140374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint msavalue = 255 - avalue;
140474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint rvalue = vert0->color[0]*avalue;
140574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint gvalue = vert0->color[1]*avalue;
140674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint bvalue = vert0->color[2]*avalue;
1407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1
1409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1
1410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define PLOT(X,Y)					\
141174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   { GLuint *ptr4 = (GLuint *) PIXELADDR4(X, Y);		\
14127e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul     GLuint  pixel = 0;					\
1413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg     pixel |=((((((*ptr4) >> rshift) & 0xff)*msavalue+rvalue)>>8) << rshift);\
1414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg     pixel |=((((((*ptr4) >> gshift) & 0xff)*msavalue+gvalue)>>8) << gshift);\
1415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg     pixel |=((((((*ptr4) >> bshift) & 0xff)*msavalue+bvalue)>>8) << bshift);\
14167e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul     *ptr4 = pixel;					\
1417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32
1420724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h"
1421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
1422724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h"
1423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1426ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul
1427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, Z-less, alpha-blended, RGB line into an osmesa buffer.
142974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * XXX update for GLchan
1430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
143174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
143274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_blend_rgba_z_line( GLcontext *ctx,
143374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                        const SWvertex *vert0, const SWvertex *vert1 )
1434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
143574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
143674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint rshift = osmesa->rshift;
143774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint gshift = osmesa->gshift;
143874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint bshift = osmesa->bshift;
143974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint avalue = vert0->color[3];
144074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint msavalue = 256 - avalue;
144174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint rvalue = vert0->color[0]*avalue;
144274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint gvalue = vert0->color[1]*avalue;
144374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint bvalue = vert0->color[2]*avalue;
1444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1
1446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1
1447ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
1448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1
14497e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul#define PLOT(X,Y)							\
14507e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	if (Z < *zPtr) {						\
145174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul	   GLuint *ptr4 = (GLuint *) PIXELADDR4(X, Y);			\
14527e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	   GLuint  pixel = 0;						\
1453ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul	   pixel |=((((((*ptr4) >> rshift) & 0xff)*msavalue+rvalue)>>8) << rshift);	\
1454ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul	   pixel |=((((((*ptr4) >> gshift) & 0xff)*msavalue+gvalue)>>8) << gshift);	\
1455ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul	   pixel |=((((((*ptr4) >> bshift) & 0xff)*msavalue+bvalue)>>8) << bshift);	\
14567e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	   *ptr4 = pixel; 						\
1457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	}
1458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32
1460724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h"
1461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
1462724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h"
1463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1466ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul
1467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Draw a flat-shaded, Z-less, alpha-blended, RGB line into an osmesa buffer.
146974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul * XXX update for GLchan
1470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
147174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulstatic void
147274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paulflat_blend_rgba_z_line_write( GLcontext *ctx,
147374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                              const SWvertex *vert0, const SWvertex *vert1 )
1474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
147574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
147674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint rshift = osmesa->rshift;
147774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint gshift = osmesa->gshift;
147874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint bshift = osmesa->bshift;
147974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint avalue = vert0->color[3];
148074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint msavalue = 256 - avalue;
148174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint rvalue = vert0->color[0]*avalue;
148274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint gvalue = vert0->color[1]*avalue;
148374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const GLint bvalue = vert0->color[2]*avalue;
1484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_XY 1
1486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1
1487ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
1488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define CLIP_HACK 1
14897e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul#define PLOT(X,Y)							\
14907e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	if (Z < *zPtr) {						\
149174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul	   GLuint *ptr4 = (GLuint *) PIXELADDR4(X, Y);			\
14927e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	   GLuint  pixel = 0;						\
1493ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul	   pixel |=((((((*ptr4) >> rshift) & 0xff)*msavalue+rvalue)>>8) << rshift);	\
1494ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul	   pixel |=((((((*ptr4) >> gshift) & 0xff)*msavalue+gvalue)>>8) << gshift);	\
1495ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul	   pixel |=((((((*ptr4) >> bshift) & 0xff)*msavalue+bvalue)>>8) << bshift);	\
14967e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	   *ptr4 = pixel;						\
14977e67fb41fb54e050f6983b4de09ed3a317d6148fBrian Paul	   *zPtr = Z;							\
1498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	}
1499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32
1501724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_linetemp.h"
1502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
1503724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_linetemp.h"
1504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Analyze context state to see if we can provide a fast line drawing
1510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * function, like those in lines.c.  Otherwise, return NULL.
1511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
1512dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansenstatic swrast_line_func
15131e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellosmesa_choose_line_function( GLcontext *ctx )
1514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
151574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
151674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const SWcontext *swrast = SWRAST_CONTEXT(ctx);
1517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
151874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (CHAN_BITS != 8)                    return NULL;
15192d595d70202bad560c27ea81ec71b740415b3355Brian Paul   if (ctx->RenderMode != GL_RENDER)      return NULL;
1520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx->Line.SmoothFlag)              return NULL;
15212d595d70202bad560c27ea81ec71b740415b3355Brian Paul   if (ctx->Texture._ReallyEnabled)       return NULL;
152274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->Light.ShadeModel != GL_FLAT)  return NULL;
152374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->Line.Width != 1.0F)           return NULL;
152474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->Line.StippleFlag)             return NULL;
152574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->Line.SmoothFlag)              return NULL;
152674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (osmesa->format != OSMESA_RGBA &&
152774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       osmesa->format != OSMESA_BGRA &&
152874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       osmesa->format != OSMESA_ARGB)     return NULL;
152974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
153074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (swrast->_RasterMask==DEPTH_BIT
153174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Depth.Func==GL_LESS
153274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Depth.Mask==GL_TRUE
153374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) {
153474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      return flat_rgba_z_line;
153574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
153674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
153774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (swrast->_RasterMask == 0) {
153874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      return flat_rgba_line;
153974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
154074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
154174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (swrast->_RasterMask==(DEPTH_BIT|BLEND_BIT)
154274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Depth.Func==GL_LESS
154374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Depth.Mask==GL_TRUE
154474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS
154574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendSrcRGB==GL_SRC_ALPHA
154674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendDstRGB==GL_ONE_MINUS_SRC_ALPHA
154774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendSrcA==GL_SRC_ALPHA
154874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendDstA==GL_ONE_MINUS_SRC_ALPHA
154974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendEquation==GL_FUNC_ADD_EXT) {
155074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      return flat_blend_rgba_z_line_write;
155174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
155274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
155374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (swrast->_RasterMask==(DEPTH_BIT|BLEND_BIT)
155474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Depth.Func==GL_LESS
155574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Depth.Mask==GL_FALSE
155674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS
155774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendSrcRGB==GL_SRC_ALPHA
155874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendDstRGB==GL_ONE_MINUS_SRC_ALPHA
155974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendSrcA==GL_SRC_ALPHA
156074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendDstA==GL_ONE_MINUS_SRC_ALPHA
156174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendEquation==GL_FUNC_ADD_EXT) {
156274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      return flat_blend_rgba_z_line;
156374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
1564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
156574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (swrast->_RasterMask==BLEND_BIT
156674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendSrcRGB==GL_SRC_ALPHA
156774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendDstRGB==GL_ONE_MINUS_SRC_ALPHA
156874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendSrcA==GL_SRC_ALPHA
156974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendDstA==GL_ONE_MINUS_SRC_ALPHA
157074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       && ctx->Color.BlendEquation==GL_FUNC_ADD_EXT) {
157174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      return flat_blend_rgba_line;
1572afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
157374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
1574afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   return NULL;
1575afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1576afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1577afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1578afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1579afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*****                 Optimized triangle rendering               *****/
1580afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/**********************************************************************/
1581afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1582afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1583afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1584afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Smooth-shaded, z-less triangle, RGBA color.
1585afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
1586dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansenstatic void smooth_rgba_z_triangle( GLcontext *ctx,
1587a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul				    const SWvertex *v0,
1588a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                                    const SWvertex *v1,
1589a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                                    const SWvertex *v2 )
1590afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
159174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
159223ee049401fdaaa77240a3eb02ca4dcce421a939Randy Frank
1593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1
1594ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
1595afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_RGB 1
1596afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_ALPHA 1
1597afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INNER_LOOP( LEFT, RIGHT, Y )				\
1598afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{								\
1599afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint i, len = RIGHT-LEFT;					\
160074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLchan *img = PIXELADDR4(LEFT, Y); 				\
160174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (void) fffog;                        			\
160274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i = 0; i < len; i++, img += 4) {			\
1603afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      GLdepth z = FixedToDepth(ffz);				\
1604afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      if (z < zRow[i]) {					\
160574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         PACK_RGBA(img, FixedToInt(ffr), FixedToInt(ffg),	\
160674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul		        FixedToInt(ffb), FixedToInt(ffa));	\
1607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         zRow[i] = z;						\
1608afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }								\
1609afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ffr += fdrdx;  ffg += fdgdx;  ffb += fdbdx;  ffa += fdadx;\
1610afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ffz += fdzdx;						\
1611afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }								\
1612afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1613afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32
1614724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_tritemp.h"
1615afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
1616724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_tritemp.h"
1617afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1618afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1619afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1620afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1621afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1622afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1623afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1624afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Flat-shaded, z-less triangle, RGBA color.
1625afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
1626dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansenstatic void flat_rgba_z_triangle( GLcontext *ctx,
1627a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul				  const SWvertex *v0,
1628a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                                  const SWvertex *v1,
1629a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                                  const SWvertex *v2 )
1630afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
163174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1632afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#define INTERP_Z 1
1633ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
163474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define SETUP_CODE						\
163574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLuint pixel;						\
163674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   PACK_RGBA((GLchan *) &pixel, v0->color[0], v0->color[1],	\
163774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul                                v0->color[2], v0->color[3]);
163874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
163974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul#define INNER_LOOP( LEFT, RIGHT, Y )			\
164074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul{							\
164174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLint i, len = RIGHT-LEFT;				\
164274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   GLuint *img = (GLuint *) PIXELADDR4(LEFT, Y);   	\
164374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   (void) fffog;                        		\
164474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   for (i=0;i<len;i++) {				\
164574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      GLdepth z = FixedToDepth(ffz);			\
164674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      if (z < zRow[i]) {				\
164774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         img[i] = pixel;				\
164874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         zRow[i] = z;					\
164974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }							\
165074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      ffz += fdzdx;					\
165174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }							\
1652afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1653afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef WIN32
1654724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "..\swrast\s_tritemp.h"
1655afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
1656724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/s_tritemp.h"
1657afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
1658afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1659afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1660afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1661afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1662afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
1663afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return pointer to an accelerated triangle function if possible.
1664afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
1665dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansenstatic swrast_tri_func
16661e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellosmesa_choose_triangle_function( GLcontext *ctx )
1667afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
166874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
166974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   const SWcontext *swrast = SWRAST_CONTEXT(ctx);
167074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
167174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (CHAN_BITS != 8)                  return (swrast_tri_func) NULL;
167274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->RenderMode != GL_RENDER)    return (swrast_tri_func) NULL;
167374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->Polygon.SmoothFlag)         return (swrast_tri_func) NULL;
167474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->Polygon.StippleFlag)        return (swrast_tri_func) NULL;
167574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (ctx->Texture._ReallyEnabled)     return (swrast_tri_func) NULL;
167674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (osmesa->format != OSMESA_RGBA &&
167774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       osmesa->format != OSMESA_BGRA &&
167874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       osmesa->format != OSMESA_ARGB)   return (swrast_tri_func) NULL;
167974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
168074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (swrast->_RasterMask == DEPTH_BIT &&
168174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       ctx->Depth.Func == GL_LESS &&
168274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       ctx->Depth.Mask == GL_TRUE &&
168374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul       ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) {
168474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      if (ctx->Light.ShadeModel == GL_SMOOTH) {
1685afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return smooth_rgba_z_triangle;
1686afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1687afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      else {
1688afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return flat_rgba_z_triangle;
1689afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      }
1690afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
169174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   return (swrast_tri_func) NULL;
16921e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell}
16931e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
169474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
169574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
16961e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell/* Override for the swrast triangle-selection function.  Try to use one
16971e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell * of our internal triangle functions, otherwise fall back to the
1698dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen * standard swrast functions.
16991e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell */
17001e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_choose_triangle( GLcontext *ctx )
17011e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{
17021e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   SWcontext *swrast = SWRAST_CONTEXT(ctx);
17031e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
17041e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   swrast->Triangle = osmesa_choose_triangle_function( ctx );
17051e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   if (!swrast->Triangle)
17061e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell      _swrast_choose_triangle( ctx );
1707afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1708afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
17091e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_choose_line( GLcontext *ctx )
17101e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{
17111e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   SWcontext *swrast = SWRAST_CONTEXT(ctx);
17121e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
17131e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   swrast->Line = osmesa_choose_line_function( ctx );
17141e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   if (!swrast->Line)
17151e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell      _swrast_choose_line( ctx );
17161e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell}
17171e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
17181e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
17192d595d70202bad560c27ea81ec71b740415b3355Brian Paul#define OSMESA_NEW_LINE   (_NEW_LINE | \
17202d595d70202bad560c27ea81ec71b740415b3355Brian Paul                           _NEW_TEXTURE | \
17212d595d70202bad560c27ea81ec71b740415b3355Brian Paul                           _NEW_LIGHT | \
17222d595d70202bad560c27ea81ec71b740415b3355Brian Paul                           _NEW_DEPTH | \
17232d595d70202bad560c27ea81ec71b740415b3355Brian Paul                           _NEW_RENDERMODE | \
1724dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen                           _SWRAST_NEW_RASTERMASK)
17252d595d70202bad560c27ea81ec71b740415b3355Brian Paul
17262d595d70202bad560c27ea81ec71b740415b3355Brian Paul#define OSMESA_NEW_TRIANGLE (_NEW_POLYGON | \
17272d595d70202bad560c27ea81ec71b740415b3355Brian Paul                             _NEW_TEXTURE | \
17282d595d70202bad560c27ea81ec71b740415b3355Brian Paul                             _NEW_LIGHT | \
17292d595d70202bad560c27ea81ec71b740415b3355Brian Paul                             _NEW_DEPTH | \
17302d595d70202bad560c27ea81ec71b740415b3355Brian Paul                             _NEW_RENDERMODE | \
17312d595d70202bad560c27ea81ec71b740415b3355Brian Paul                             _SWRAST_NEW_RASTERMASK)
17321e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
17331e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell
1734dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen/* Extend the software rasterizer with our line and triangle
17351e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell * functions.
17361e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell */
17371e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwellstatic void osmesa_register_swrast_functions( GLcontext *ctx )
17381e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell{
17391e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   SWcontext *swrast = SWRAST_CONTEXT( ctx );
1740dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen
17411e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   swrast->choose_line = osmesa_choose_line;
17421e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   swrast->choose_triangle = osmesa_choose_triangle;
1743dbd1e2b5990a3689bf718296c57c14fc3ba38db5Jouk Jansen
17441e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   swrast->invalidate_line |= OSMESA_NEW_LINE;
17451e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   swrast->invalidate_triangle |= OSMESA_NEW_TRIANGLE;
17461e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell}
1747ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul
1748ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul
1749afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic const GLubyte *get_string( GLcontext *ctx, GLenum name )
1750afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1751afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   (void) ctx;
1752afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (name) {
1753afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_RENDERER:
1754afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return (const GLubyte *) "Mesa OffScreen";
1755afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
1756afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return NULL;
1757afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1758afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1759afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1760afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1761cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstatic void osmesa_update_state( GLcontext *ctx, GLuint new_state )
1762afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1763c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul   OSMesaContext osmesa = OSMESA_CONTEXT(ctx);
1764304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul
1765304357dcd496f7ebf499fd9c77b4eba83a75abd5Brian Paul   ASSERT((void *) osmesa == (void *) ctx->DriverCtx);
1766afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
176774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   /*
176874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul    * XXX these function pointers could be initialized just once during
176974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul    * context creation since they don't depend on any state changes.
177074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul    */
177174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul
1772afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Driver.GetString = get_string;
1773afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Driver.UpdateState = osmesa_update_state;
1774afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1775cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul   ctx->Driver.SetDrawBuffer = set_draw_buffer;
1776cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul   ctx->Driver.SetReadBuffer = set_read_buffer;
1777f930330d5f8dbc61d449be65da9e6a951b18a909Brian Paul
1778afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Driver.Clear = clear;
1779afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1780afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Driver.GetBufferSize = buffer_size;
1781afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
17821e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   ctx->Driver.PointsFunc = _swsetup_Points;
17831e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   ctx->Driver.LineFunc = _swsetup_Line;
17841e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   ctx->Driver.TriangleFunc = _swsetup_Triangle;
17851e885f6e6ce9c46c3220eb0472bdfe2aa7946596Keith Whitwell   ctx->Driver.QuadFunc = _swsetup_Quad;
1786cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ctx->Driver.BuildProjectedVertices = _swsetup_BuildProjectedVertices;
1787547bbcabffffad1a630c261830998c511efc2b96Brian Paul   ctx->Driver.RenderPrimitive = _swsetup_RenderPrimitive;
1788547bbcabffffad1a630c261830998c511efc2b96Brian Paul   ctx->Driver.RenderStart = _swsetup_RenderStart;
1789547bbcabffffad1a630c261830998c511efc2b96Brian Paul   ctx->Driver.RenderFinish = _swsetup_RenderFinish;
1790afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1791afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* RGB(A) span/pixel functions */
179274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   if (osmesa->format == OSMESA_RGB) {
179374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      ctx->Driver.WriteRGBASpan = write_rgba_span_RGB;
179474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      ctx->Driver.WriteRGBSpan = write_rgb_span_RGB;
179574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      ctx->Driver.WriteMonoRGBASpan = write_monocolor_span_RGB;
179674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      ctx->Driver.WriteRGBAPixels = write_rgba_pixels_RGB;
179774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      ctx->Driver.WriteMonoRGBAPixels = write_monocolor_pixels_RGB;
179874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      ctx->Driver.ReadRGBASpan = read_rgba_span3;
179974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      ctx->Driver.ReadRGBAPixels = read_rgba_pixels3;
180074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   }
180174b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul   else if (osmesa->format == OSMESA_BGR) {
180274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      ctx->Driver.WriteRGBASpan = write_rgba_span_BGR;
180374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      ctx->Driver.WriteRGBSpan = write_rgb_span_BGR;
180474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      ctx->Driver.WriteMonoRGBASpan = write_monocolor_span_BGR;
180574b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      ctx->Driver.WriteRGBAPixels = write_rgba_pixels_BGR;
180674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      ctx->Driver.WriteMonoRGBAPixels = write_monocolor_pixels_BGR;
1807afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->Driver.ReadRGBASpan = read_rgba_span3;
1808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->Driver.ReadRGBAPixels = read_rgba_pixels3;
1809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1810afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
1811afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      /* 4 bytes / pixel in frame buffer */
1812afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->Driver.WriteRGBSpan = write_rgb_span;
1813afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->Driver.WriteRGBAPixels = write_rgba_pixels;
1814afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->Driver.WriteMonoRGBASpan = write_monocolor_span;
1815afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->Driver.WriteMonoRGBAPixels = write_monocolor_pixels;
181674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      if (osmesa->format == OSMESA_RGBA &&
181774b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul          CHAN_TYPE == GL_UNSIGNED_BYTE &&
181874b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul          RCOMP==0 && GCOMP==1 && BCOMP==2 && ACOMP==3) {
181974b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         /* special, fast case */
182074b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         ctx->Driver.WriteRGBASpan = write_rgba_span_rgba;
1821afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctx->Driver.ReadRGBASpan = read_rgba_span_rgba;
182274b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
182374b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      else {
182474b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul         ctx->Driver.WriteRGBASpan = write_rgba_span;
1825afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctx->Driver.ReadRGBASpan = read_rgba_span;
182674b493a5e61237de081a438e774e5d8139d4c6b7Brian Paul      }
1827afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->Driver.ReadRGBAPixels = read_rgba_pixels;
1828afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1829afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1830afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* CI span/pixel functions */
1831afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Driver.WriteCI32Span = write_index32_span;
1832afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Driver.WriteCI8Span = write_index8_span;
1833afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Driver.WriteMonoCISpan = write_monoindex_span;
1834afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Driver.WriteCI32Pixels = write_index_pixels;
1835afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Driver.WriteMonoCIPixels = write_monoindex_pixels;
1836afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Driver.ReadCI32Span = read_index_span;
1837afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Driver.ReadCI32Pixels = read_index_pixels;
183823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell
1839cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   _swrast_InvalidateState( ctx, new_state );
1840cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   _swsetup_InvalidateState( ctx, new_state );
184158e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell   _ac_InvalidateState( ctx, new_state );
1842cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   _tnl_InvalidateState( ctx, new_state );
1843afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1844