summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/ggi/default/linear.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/drivers/ggi/default/linear.c')
-rw-r--r--src/mesa/drivers/ggi/default/linear.c333
1 files changed, 333 insertions, 0 deletions
diff --git a/src/mesa/drivers/ggi/default/linear.c b/src/mesa/drivers/ggi/default/linear.c
new file mode 100644
index 0000000000..6acdf4d801
--- /dev/null
+++ b/src/mesa/drivers/ggi/default/linear.c
@@ -0,0 +1,333 @@
+/* GGI-Driver for MESA
+ *
+ * Copyright (C) 1997 Uwe Maurer
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * ---------------------------------------------------------------------
+ * This code was derived from the following source of information:
+ *
+ * svgamesa.c and ddsample.c by Brian Paul
+ *
+ */
+
+#include <ggi/mesa/ggimesa.h>
+#include <ggi/mesa/ggimesa_int.h>
+
+#define RMASK ((1<<R)-1)
+#define GMASK ((1<<G)-1)
+#define BMASK ((1<<B)-1)
+
+#define RS (8-R)
+#define GS (8-G)
+#define BS (8-B)
+
+
+/**********************************************************************/
+/***** Write spans of pixels *****/
+/**********************************************************************/
+
+void GGIwrite_ci32_span(const GLcontext *ctx,
+ GLuint n, GLint x, GLint y,
+ const GLuint ci[],
+ const GLubyte mask[])
+{
+ FB_TYPE *fb=LFB(FB_TYPE,x,FLIP(y));
+ if (mask)
+ {
+ while (n--) {
+ if (*mask++) *fb=*ci;
+ fb++;
+ ci++;
+ }
+ }
+ else
+ {
+ while (n--) *fb++ = *ci++;
+ }
+}
+
+void GGIwrite_ci8_span(const GLcontext *ctx,
+ GLuint n, GLint x, GLint y,
+ const GLubyte ci[],
+ const GLubyte mask[] )
+{
+ FB_TYPE *fb=LFB(FB_TYPE,x,FLIP(y));
+
+ if (mask)
+ {
+ while (n--) {
+ if (*mask++) *fb=*ci;
+ fb++;
+ ci++;
+ }
+ }
+ else
+ {
+ while (n--) *fb++ = *ci++;
+ }
+}
+
+
+void GGIwrite_rgba_span(const GLcontext *ctx,
+ GLuint n, GLint x, GLint y,
+ const GLubyte rgba[][4],
+ const GLubyte mask[])
+{
+ FB_TYPE *fb=LFB(FB_TYPE,x,FLIP(y));
+
+ if (mask)
+ {
+ while (n--) {
+ if (*mask++) {
+ *fb= ((rgba[0][RCOMP]>>RS) << (G+B)) |
+ ((rgba[0][GCOMP]>>GS) << B) |
+ ((rgba[0][BCOMP]>>BS));
+ }
+ fb++;
+ rgba++;
+ }
+ }
+ else
+ {
+ while (n--) {
+ *fb++= ((rgba[0][RCOMP]>>RS) << (G+B)) |
+ ((rgba[0][GCOMP]>>GS) << B)|
+ ((rgba[0][BCOMP]>>BS));
+ rgba++;
+ }
+ }
+}
+
+void GGIwrite_rgb_span( const GLcontext *ctx,
+ GLuint n, GLint x, GLint y,
+ const GLubyte rgba[][3],
+ const GLubyte mask[] )
+{
+ FB_TYPE *fb=LFB(FB_TYPE,x,FLIP(y));
+ if (mask)
+ {
+ while (n--) {
+ if (*mask++) {
+ *fb= ((rgba[0][RCOMP]>>RS) << (G+B)) |
+ ((rgba[0][GCOMP]>>GS) << B) |
+ ((rgba[0][BCOMP]>>BS));
+ }
+ fb++;
+ rgba++;
+ }
+ }
+ else
+ {
+ while (n--) {
+ *fb++= ((rgba[0][RCOMP]>>RS) << (G+B)) |
+ ((rgba[0][GCOMP]>>GS) << B) |
+ ((rgba[0][BCOMP]>>BS));
+ rgba++;
+ }
+ }
+}
+
+
+void GGIwrite_mono_span( const GLcontext *ctx,
+ GLuint n, GLint x, GLint y,
+ const GLubyte mask[])
+{
+ FB_TYPE *fb;
+ FB_TYPE color;
+
+ if (mask)
+ {
+ fb=LFB(FB_TYPE,x,FLIP(y));
+ color=(FB_TYPE) GGICTX->color;
+
+ while (n--)
+ {
+ if (*mask++) *fb=color;
+ fb++;
+ }
+ }
+ else
+ {
+ ggiDrawHLine(VIS,x,FLIP(y),n);
+ }
+}
+
+
+/**********************************************************************/
+/***** Read spans of pixels *****/
+/**********************************************************************/
+
+
+void GGIread_ci32_span(const GLcontext *ctx,
+ GLuint n, GLint x, GLint y, GLuint ci[])
+{
+ FB_TYPE *fb=LFB(FB_TYPE,x,FLIP(y));
+ while (n--)
+ *ci++=(GLuint)*fb++;
+}
+
+void GGIread_rgba_span(const GLcontext *ctx,
+ GLuint n, GLint x, GLint y,
+ GLubyte rgba[][4])
+{
+ FB_TYPE *fb=LFB(FB_TYPE,x,FLIP(y));
+ FB_TYPE color;
+
+ while (n--)
+ {
+ color=*fb++;
+ rgba[0][RCOMP] = (GLubyte) (color>>(G+B))<<RS;
+ rgba[0][GCOMP] = (GLubyte) ((color>>B)& ((1<<G)-1))<<GS;
+ rgba[0][BCOMP] = (GLubyte) (color & ((1<<B)-1))<<BS;
+ rgba[0][ACOMP] =0;
+ rgba++;
+ }
+}
+
+/**********************************************************************/
+/***** Write arrays of pixels *****/
+/**********************************************************************/
+
+void GGIwrite_ci32_pixels(const GLcontext *ctx,
+ GLuint n, const GLint x[], const GLint y[],
+ const GLuint ci[], const GLubyte mask[] )
+{
+ FB_TYPE *fb=LFB(FB_TYPE,0,0);
+
+ while (n--) {
+ if (*mask++) *(fb+ *x + FLIP(*y)*GGICTX->width)=*ci;
+ ci++;
+ x++;
+ y++;
+ }
+}
+
+void GGIwrite_mono_pixels(const GLcontext *ctx,
+ GLuint n,
+ const GLint x[], const GLint y[],
+ const GLubyte mask[] )
+{
+ FB_TYPE *fb=LFB(FB_TYPE,0,0);
+ FB_TYPE color=(FB_TYPE) GGICTX->color;
+
+ while (n--) {
+ if (*mask++) *(fb+ *x + FLIP(*y)*GGICTX->width)=color;
+ x++;
+ y++;
+ }
+}
+
+void GGIwrite_rgba_pixels(const GLcontext *ctx,
+ GLuint n, const GLint x[], const GLint y[],
+ const GLubyte rgba[][4],
+ const GLubyte mask[] )
+{
+ FB_TYPE *fb=LFB(FB_TYPE,0,0);
+ FB_TYPE color;
+
+ while (n--) {
+ if (*mask++) {
+ color= ((rgba[0][RCOMP]>>RS) << (G+B)) |
+ ((rgba[0][GCOMP]>>GS) << B) |
+ ((rgba[0][BCOMP]>>BS));
+ *(fb+ *x + FLIP(*y)*GGICTX->width)=color;
+ }
+ x++;y++;
+ rgba++;
+ }
+}
+
+
+/**********************************************************************/
+/***** Read arrays of pixels *****/
+/**********************************************************************/
+
+void GGIread_ci32_pixels(const GLcontext *ctx,
+ GLuint n, const GLint x[], const GLint y[],
+ GLuint ci[], const GLubyte mask[])
+{
+ FB_TYPE *fb=LFB(FB_TYPE,0,0);
+
+ while (n--) {
+ if (*mask++)
+ *ci=*(fb+ *x + FLIP(*y)*GGICTX->width);
+ ci++;
+ x++;
+ y++;
+ }
+}
+
+void GGIread_rgba_pixels(const GLcontext *ctx,
+ GLuint n, const GLint x[], const GLint y[],
+ GLubyte rgba[][4],
+ const GLubyte mask[] )
+{
+ FB_TYPE *fb=LFB(FB_TYPE,0,0);
+ FB_TYPE color;
+
+ while (n--)
+ {
+ if (*mask++)
+ {
+ color=*(fb+ *x + FLIP(*y)*GGICTX->width);
+ rgba[0][RCOMP] =(GLubyte)(color>>(G+B))<<RS;
+ rgba[0][GCOMP] =(GLubyte)((color>>B)& ((1<<G)-1))<<GS;
+ rgba[0][BCOMP] =(GLubyte) (color & ((1<<B)-1))<<BS;
+ rgba[0][ACOMP] =0;
+ }
+ x++; y++;
+ rgba++;
+ }
+}
+
+int GGIsetup_driver(GGIMesaContext ggictx,struct ggi_mesa_info *info)
+{
+ GLcontext *ctx=ggictx->gl_ctx;
+
+ ctx->Driver.WriteRGBASpan = GGIwrite_rgba_span;
+ ctx->Driver.WriteRGBSpan = GGIwrite_rgb_span;
+ ctx->Driver.WriteMonoRGBASpan = GGIwrite_mono_span;
+ ctx->Driver.WriteRGBAPixels = GGIwrite_rgba_pixels;
+ ctx->Driver.WriteMonoRGBAPixels = GGIwrite_mono_pixels;
+
+ ctx->Driver.WriteCI32Span = GGIwrite_ci32_span;
+ ctx->Driver.WriteCI8Span = GGIwrite_ci8_span;
+ ctx->Driver.WriteMonoCISpan = GGIwrite_mono_span;
+ ctx->Driver.WriteCI32Pixels = GGIwrite_ci32_pixels;
+ ctx->Driver.WriteMonoCIPixels = GGIwrite_mono_pixels;
+
+ ctx->Driver.ReadCI32Span = GGIread_ci32_span;
+ ctx->Driver.ReadRGBASpan = GGIread_rgba_span;
+ ctx->Driver.ReadCI32Pixels = GGIread_ci32_pixels;
+ ctx->Driver.ReadRGBAPixels = GGIread_rgba_pixels;
+
+ info->red_bits=R;
+ info->green_bits=G;
+ info->blue_bits=B;
+
+ return 0;
+}
+
+int GGIdlinit(ggi_visual_t vis,const char *version,void *argptr)
+{
+ LIBGGI_MESAEXT(vis)->setup_driver=GGIsetup_driver;
+
+ return 0;
+}
+
+int GGIdlcleanup(ggi_visual_t vis)
+{
+ return 0;
+}