This is mmesai.c in view mode; [Download] [Up]
/**************************************************************************** * * Mesa bindings for SciTech MGL * * Copyright (C) 1996 SciTech Software. * All rights reserved. * * Filename: $Workfile: mmesai.c $ * Version: $Revision: 1.1 $ * * Language: ANSI C * Environment: Any * * Description: Include file defining macros to implement many of the * optimized rendering functions for the MGL Mesa driver. * * 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. * * $Date: 06 Apr 1997 14:40:00 $ $Author: KendallB $ * ****************************************************************************/ /**********************************************************************/ /***** Write spans of pixels *****/ /**********************************************************************/ #define IMPLEMENT_WRITE_SPAN(DEPTH,FMT,TYPE) \ void _mmesa_write_span_##DEPTH##_##FMT (GLcontext *ctx,GLuint n, GLint x, \ GLint y,GLubyte red[], GLubyte green[],GLubyte blue[],GLubyte alpha[], \ GLubyte mask[]) \ { \ TYPE *d = PACKED##DEPTH##_pixelAddr(x,FLIP(y)); \ if (mask) { \ while (n >= 8) { \ if (mask[0]) d[0] = PACK_COLOR_##FMT(red[0],green[0],blue[0]); \ if (mask[1]) d[1] = PACK_COLOR_##FMT(red[1],green[1],blue[1]); \ if (mask[2]) d[2] = PACK_COLOR_##FMT(red[2],green[2],blue[2]); \ if (mask[3]) d[3] = PACK_COLOR_##FMT(red[3],green[3],blue[3]); \ if (mask[4]) d[4] = PACK_COLOR_##FMT(red[4],green[4],blue[4]); \ if (mask[5]) d[5] = PACK_COLOR_##FMT(red[5],green[5],blue[5]); \ if (mask[6]) d[6] = PACK_COLOR_##FMT(red[6],green[6],blue[6]); \ if (mask[7]) d[7] = PACK_COLOR_##FMT(red[7],green[7],blue[7]); \ d += 8; red += 8; green += 8; blue += 8; mask += 8; n -= 8; \ } \ while (n--) { \ if (mask[0]) d[0] = PACK_COLOR_##FMT(red[0],green[0],blue[0]); \ d++; red++; green++; blue++; mask++; \ } \ } \ else { \ while (n >= 8) { \ d[0] = PACK_COLOR_##FMT(red[0],green[0],blue[0]); \ d[1] = PACK_COLOR_##FMT(red[1],green[1],blue[1]); \ d[2] = PACK_COLOR_##FMT(red[2],green[2],blue[2]); \ d[3] = PACK_COLOR_##FMT(red[3],green[3],blue[3]); \ d[4] = PACK_COLOR_##FMT(red[4],green[4],blue[4]); \ d[5] = PACK_COLOR_##FMT(red[5],green[5],blue[5]); \ d[6] = PACK_COLOR_##FMT(red[6],green[6],blue[6]); \ d[7] = PACK_COLOR_##FMT(red[7],green[7],blue[7]); \ d += 8; red += 8; green += 8; blue += 8; n -= 8; \ } \ while (n--) { \ d[0] = PACK_COLOR_##FMT(red[0],green[0],blue[0]); \ d++; red++; green++; blue++; \ } \ } \ } #define IMPLEMENT_WRITE_SPAN_DITHER(DEPTH,FMT,TYPE) \ void _mmesa_write_span_##DEPTH##_##FMT(GLcontext *ctx,GLuint n, GLint x, \ GLint y,GLubyte red[], GLubyte green[],GLubyte blue[],GLubyte alpha[], \ GLubyte mask[]) \ { \ TYPE *d; \ y = FLIP(y); \ d = PACKED##DEPTH##_pixelAddr(x,y); \ if (mask) { \ while (n >= 4) { \ if (mask[0]) PACK_COLOR_##FMT(d[0],x,y,red[0],green[0],blue[0]); \ if (mask[1]) PACK_COLOR_##FMT(d[1],x+1,y,red[1],green[1],blue[1]); \ if (mask[2]) PACK_COLOR_##FMT(d[2],x+2,y,red[2],green[2],blue[2]); \ if (mask[3]) PACK_COLOR_##FMT(d[3],x+3,y,red[3],green[3],blue[3]); \ d += 4; red += 4; green += 4; blue += 4; mask += 4; x += 4; n -= 4; \ } \ while (n--) { \ if (mask[0]) PACK_COLOR_##FMT(d[0],x,y,red[0],green[0],blue[0]); \ d++; red++; green++; blue++; mask++; x++; \ } \ } \ else { \ while (n >= 4) { \ PACK_COLOR_##FMT(d[0],x,y,red[0],green[0],blue[0]); \ PACK_COLOR_##FMT(d[1],x+1,y,red[1],green[1],blue[1]); \ PACK_COLOR_##FMT(d[2],x+2,y,red[2],green[2],blue[2]); \ PACK_COLOR_##FMT(d[3],x+3,y,red[3],green[3],blue[3]); \ d += 4; red += 4; green += 4; blue += 4; x += 4; n -= 4; \ } \ while (n--) { \ PACK_COLOR_##FMT(d[0],x,y,red[0],green[0],blue[0]); \ d++; red++; green++; blue++; x++; \ } \ } \ } #define IMPLEMENT_WRITE_SPAN_MONO(DEPTH,TYPE) \ void _mmesa_write_span_mono_##DEPTH (GLcontext *ctx,GLuint n,GLint x, \ GLint y,GLubyte mask[]) \ { \ TYPE *d = PACKED##DEPTH##_pixelAddr(x,FLIP(y)); \ while (n >= 8) { \ if (mask[0]) d[0] = (TYPE)RC.color; \ if (mask[1]) d[1] = (TYPE)RC.color; \ if (mask[2]) d[2] = (TYPE)RC.color; \ if (mask[3]) d[3] = (TYPE)RC.color; \ if (mask[4]) d[4] = (TYPE)RC.color; \ if (mask[5]) d[5] = (TYPE)RC.color; \ if (mask[6]) d[6] = (TYPE)RC.color; \ if (mask[7]) d[7] = (TYPE)RC.color; \ d += 8; mask += 8; n -= 8; \ } \ while (n--) { \ if (mask[0]) d[0] = (TYPE)RC.color; \ d++; mask++; \ } \ } #define IMPLEMENT_WRITE_SPAN_MONO_DITHER(DEPTH,FMT,TYPE) \ void _mmesa_write_span_mono_##DEPTH##_##FMT (GLcontext *ctx,GLuint n,GLint x, \ GLint y,GLubyte mask[]) \ { \ HALFTONE_VARS_##DEPTH; \ TYPE *d; \ y = FLIP(y); \ d = PACKED##DEPTH##_pixelAddr(x,y); \ SETUP_##FMT(y,RC.red,RC.green,RC.blue); \ while (n >= 4) { \ if (mask[0]) PACK_COLOR2_##FMT(d[0],x); \ if (mask[1]) PACK_COLOR2_##FMT(d[1],x+1); \ if (mask[2]) PACK_COLOR2_##FMT(d[2],x+2); \ if (mask[3]) PACK_COLOR2_##FMT(d[3],x+3); \ d += 4; mask += 4; x += 4; n -= 4; \ } \ while (n--) { \ if (mask[0]) PACK_COLOR2_##FMT(d[0],x); \ d++; mask++; x++; \ } \ } /**********************************************************************/ /***** Write arrays of pixels *****/ /**********************************************************************/ #define IMPLEMENT_WRITE_PIXELS(DEPTH,FMT,TYPE) \ void _mmesa_write_pixels_##DEPTH##_##FMT (GLcontext *ctx,GLuint n, GLint x[], \ GLint y[],GLubyte r[], GLubyte g[],GLubyte b[], \ GLubyte a[],GLubyte mask[]) \ { \ while (n >= 4) { \ if (mask[0]) *((TYPE*)PACKED##DEPTH##_pixelAddr(x[0],FLIP(y[0]))) = PACK_COLOR_##FMT(r[0],g[0],b[0]); \ if (mask[1]) *((TYPE*)PACKED##DEPTH##_pixelAddr(x[1],FLIP(y[1]))) = PACK_COLOR_##FMT(r[1],g[1],b[1]); \ if (mask[2]) *((TYPE*)PACKED##DEPTH##_pixelAddr(x[2],FLIP(y[2]))) = PACK_COLOR_##FMT(r[2],g[2],b[2]); \ if (mask[3]) *((TYPE*)PACKED##DEPTH##_pixelAddr(x[3],FLIP(y[3]))) = PACK_COLOR_##FMT(r[3],g[3],b[3]); \ r += 4; g += 4; b += 4; mask += 4; x+= 4; y += 4; n -= 4; \ } \ while (n--) { \ if (mask[0]) *((TYPE*)PACKED##DEPTH##_pixelAddr(x[0],FLIP(y[0]))) = PACK_COLOR_##FMT(r[0],g[0],b[0]); \ r++; g++; b++; mask++; x++; y++; \ } \ } #define IMPLEMENT_WRITE_PIXELS_DITHER(DEPTH,FMT,TYPE) \ void _mmesa_write_pixels_##DEPTH##_##FMT(GLcontext *ctx,GLuint n, GLint x[], \ GLint y[],GLubyte r[], GLubyte g[],GLubyte b[], \ GLubyte a[],GLubyte mask[]) \ { \ while (n--) { \ if (mask[0]) { \ TYPE *d = PACKED##DEPTH##_pixelAddr(x[0],FLIP(y[0])); \ PACK_COLOR_##FMT(d[0],x[0],FLIP(y[0]),r[0],g[0],b[0]); \ } \ r++; g++; b++; mask++; x++; y++; \ } \ } #define IMPLEMENT_WRITE_PIXELS_MONO(DEPTH,TYPE) \ void _mmesa_write_pixels_mono_##DEPTH (GLcontext *ctx,GLuint n,GLint x[], \ GLint y[],GLubyte mask[]) \ { \ while (n >= 4) { \ if (mask[0]) *((TYPE*)PACKED##DEPTH##_pixelAddr(x[0],FLIP(y[0]))) = (TYPE)RC.color; \ if (mask[1]) *((TYPE*)PACKED##DEPTH##_pixelAddr(x[1],FLIP(y[1]))) = (TYPE)RC.color; \ if (mask[2]) *((TYPE*)PACKED##DEPTH##_pixelAddr(x[2],FLIP(y[2]))) = (TYPE)RC.color; \ if (mask[3]) *((TYPE*)PACKED##DEPTH##_pixelAddr(x[3],FLIP(y[3]))) = (TYPE)RC.color; \ mask += 4; x+= 4; y += 4; n -= 4; \ } \ while (n--) { \ if (mask[0]) *((TYPE*)PACKED##DEPTH##_pixelAddr(x[0],FLIP(y[0]))) = (TYPE)RC.color; \ mask++; x++; y++; \ } \ } #define IMPLEMENT_WRITE_PIXELS_MONO_DITHER(DEPTH,FMT,TYPE) \ void _mmesa_write_pixels_mono_##DEPTH##_##FMT(GLcontext *ctx,GLuint n,GLint x[], \ GLint y[],GLubyte mask[]) \ { \ while (n--) { \ if (mask[0]) { \ TYPE *d = PACKED##DEPTH##_pixelAddr(x[0],FLIP(y[0])); \ PACK_COLOR_##FMT(d[0],x[0],FLIP(y[0]),RC.red,RC.green,RC.blue); \ } \ mask++; x++; y++; \ } \ } /**********************************************************************/ /***** Read spans of pixels *****/ /**********************************************************************/ #define IMPLEMENT_READ_SPAN(DEPTH,FMT,TYPE) \ void _mmesa_read_span_##DEPTH##_##FMT(GLcontext *ctx,GLuint n, GLint x, GLint y, \ GLubyte red[], GLubyte green[],GLubyte blue[], GLubyte alpha[]) \ { \ TYPE *d = PACKED##DEPTH##_pixelAddr(x,FLIP(y)); \ while (n >= 8) { \ UNPACK_COLOR_##FMT(d[0],red[0],green[0],blue[0]); \ UNPACK_COLOR_##FMT(d[1],red[1],green[1],blue[1]); \ UNPACK_COLOR_##FMT(d[2],red[2],green[2],blue[2]); \ UNPACK_COLOR_##FMT(d[3],red[3],green[3],blue[3]); \ UNPACK_COLOR_##FMT(d[4],red[4],green[4],blue[4]); \ UNPACK_COLOR_##FMT(d[5],red[5],green[5],blue[5]); \ UNPACK_COLOR_##FMT(d[6],red[6],green[6],blue[6]); \ UNPACK_COLOR_##FMT(d[7],red[7],green[7],blue[7]); \ d += 8; red += 8; green += 8; blue += 8; n -= 8; \ } \ while (n--) { \ UNPACK_COLOR_##FMT(d[0],red[0],green[0],blue[0]); \ d++; red++; green++; blue++; \ } \ } /**********************************************************************/ /***** Read arrays of pixels *****/ /**********************************************************************/ #define IMPLEMENT_READ_PIXELS(DEPTH,FMT,TYPE) \ void _mmesa_read_pixels_##DEPTH##_##FMT (GLcontext *ctx,GLuint n, GLint x[], \ GLint y[],GLubyte red[], GLubyte green[],GLubyte blue[], \ GLubyte alpha[],GLubyte mask[]) \ { \ while (n >= 4) { \ if (mask[0]) { \ TYPE *d = PACKED##DEPTH##_pixelAddr(x[0],FLIP(y[0])); \ UNPACK_COLOR_##FMT(d[0],red[0],green[0],blue[0]); \ } \ if (mask[1]) { \ TYPE *d = PACKED##DEPTH##_pixelAddr(x[1],FLIP(y[1])); \ UNPACK_COLOR_##FMT(d[1],red[1],green[1],blue[1]); \ } \ if (mask[2]) { \ TYPE *d = PACKED##DEPTH##_pixelAddr(x[2],FLIP(y[2])); \ UNPACK_COLOR_##FMT(d[2],red[2],green[2],blue[2]); \ } \ if (mask[3]) { \ TYPE *d = PACKED##DEPTH##_pixelAddr(x[3],FLIP(y[3])); \ UNPACK_COLOR_##FMT(d[3],red[3],green[3],blue[3]); \ } \ red += 4; green += 4; blue += 4; mask += 4; x += 4; y += 4; n -= 4; \ } \ while (n--) { \ if (mask[0]) { \ TYPE *d = PACKED##DEPTH##_pixelAddr(x[0],FLIP(y[0])); \ UNPACK_COLOR_##FMT(d[0],red[0],green[0],blue[0]); \ } \ red++; green++; blue++; mask++; x++; y++; \ } \ }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.