| 1 | #ifndef _tgl_zbuffer_h_ | 
|---|
| 2 | #define _tgl_zbuffer_h_ | 
|---|
| 3 |  | 
|---|
| 4 | /* | 
|---|
| 5 | * Z buffer | 
|---|
| 6 | */ | 
|---|
| 7 |  | 
|---|
| 8 | #include "zfeatures.h" | 
|---|
| 9 |  | 
|---|
| 10 | #define ZB_Z_BITS 16 | 
|---|
| 11 |  | 
|---|
| 12 | #define ZB_POINT_Z_FRAC_BITS 14 | 
|---|
| 13 |  | 
|---|
| 14 | #define ZB_POINT_S_MIN ( (1<<13) ) | 
|---|
| 15 | #define ZB_POINT_S_MAX ( (1<<22)-(1<<13) ) | 
|---|
| 16 | #define ZB_POINT_T_MIN ( (1<<21) ) | 
|---|
| 17 | #define ZB_POINT_T_MAX ( (1<<30)-(1<<21) ) | 
|---|
| 18 |  | 
|---|
| 19 | #define ZB_POINT_RED_MIN ( (1<<10) ) | 
|---|
| 20 | #define ZB_POINT_RED_MAX ( (1<<16)-(1<<10) ) | 
|---|
| 21 | #define ZB_POINT_GREEN_MIN ( (1<<9) ) | 
|---|
| 22 | #define ZB_POINT_GREEN_MAX ( (1<<16)-(1<<9) ) | 
|---|
| 23 | #define ZB_POINT_BLUE_MIN ( (1<<10) ) | 
|---|
| 24 | #define ZB_POINT_BLUE_MAX ( (1<<16)-(1<<10) ) | 
|---|
| 25 |  | 
|---|
| 26 | /* display modes */ | 
|---|
| 27 | #define ZB_MODE_5R6G5B  1  /* true color 16 bits */ | 
|---|
| 28 | #define ZB_MODE_INDEX   2  /* color index 8 bits */ | 
|---|
| 29 | #define ZB_MODE_RGBA    3  /* 32 bit rgba mode */ | 
|---|
| 30 | #define ZB_MODE_RGB24   4  /* 24 bit rgb mode */ | 
|---|
| 31 | #define ZB_NB_COLORS    225 /* number of colors for 8 bit display */ | 
|---|
| 32 |  | 
|---|
| 33 | #if TGL_FEATURE_RENDER_BITS == 15 | 
|---|
| 34 |  | 
|---|
| 35 | #define RGB_TO_PIXEL(r,g,b) \ | 
|---|
| 36 | ((((r) >> 1) & 0x7c00) | (((g) >> 6) & 0x03e0) | ((b) >> 11)) | 
|---|
| 37 | typedef unsigned short PIXEL; | 
|---|
| 38 | /* bytes per pixel */ | 
|---|
| 39 | #define PSZB 2 | 
|---|
| 40 | /* bits per pixel = (1 << PSZH) */ | 
|---|
| 41 | #define PSZSH 4 | 
|---|
| 42 |  | 
|---|
| 43 | #elif TGL_FEATURE_RENDER_BITS == 16 | 
|---|
| 44 |  | 
|---|
| 45 | /* 16 bit mode */ | 
|---|
| 46 | #define RGB_TO_PIXEL(r,g,b) \ | 
|---|
| 47 | (((r) & 0xF800) | (((g) >> 5) & 0x07E0) | ((b) >> 11)) | 
|---|
| 48 | typedef unsigned short PIXEL; | 
|---|
| 49 | #define PSZB 2 | 
|---|
| 50 | #define PSZSH 4 | 
|---|
| 51 |  | 
|---|
| 52 | #elif TGL_FEATURE_RENDER_BITS == 24 | 
|---|
| 53 |  | 
|---|
| 54 | #define RGB_TO_PIXEL(r,g,b) \ | 
|---|
| 55 | ((((r) << 8) & 0xff0000) | ((g) & 0xff00) | ((b) >> 8)) | 
|---|
| 56 | typedef unsigned char PIXEL; | 
|---|
| 57 | #define PSZB 3 | 
|---|
| 58 | #define PSZSH 5 | 
|---|
| 59 |  | 
|---|
| 60 | #elif TGL_FEATURE_RENDER_BITS == 32 | 
|---|
| 61 |  | 
|---|
| 62 | #define RGB_TO_PIXEL(r,g,b) \ | 
|---|
| 63 | ((((r) << 8) & 0xff0000) | ((g) & 0xff00) | ((b) >> 8)) | 
|---|
| 64 | typedef unsigned int PIXEL; | 
|---|
| 65 | #define PSZB 4 | 
|---|
| 66 | #define PSZSH 5 | 
|---|
| 67 |  | 
|---|
| 68 | #else | 
|---|
| 69 |  | 
|---|
| 70 | #error Incorrect number of bits per pixel | 
|---|
| 71 |  | 
|---|
| 72 | #endif | 
|---|
| 73 |  | 
|---|
| 74 | typedef struct { | 
|---|
| 75 | int xsize,ysize; | 
|---|
| 76 | int linesize; /* line size, in bytes */ | 
|---|
| 77 | int mode; | 
|---|
| 78 |  | 
|---|
| 79 | unsigned short *zbuf; | 
|---|
| 80 | PIXEL *pbuf; | 
|---|
| 81 | int frame_buffer_allocated; | 
|---|
| 82 |  | 
|---|
| 83 | int nb_colors; | 
|---|
| 84 | unsigned char *dctable; | 
|---|
| 85 | int *ctable; | 
|---|
| 86 | PIXEL *current_texture; | 
|---|
| 87 | } ZBuffer; | 
|---|
| 88 |  | 
|---|
| 89 | typedef struct { | 
|---|
| 90 | int x,y,z;     /* integer coordinates in the zbuffer */ | 
|---|
| 91 | int s,t;       /* coordinates for the mapping */ | 
|---|
| 92 | int r,g,b;     /* color indexes */ | 
|---|
| 93 |  | 
|---|
| 94 | float sz,tz;   /* temporary coordinates for mapping */ | 
|---|
| 95 | } ZBufferPoint; | 
|---|
| 96 |  | 
|---|
| 97 | /* zbuffer.c */ | 
|---|
| 98 |  | 
|---|
| 99 | ZBuffer *ZB_open(int xsize,int ysize,int mode, | 
|---|
| 100 | int nb_colors, | 
|---|
| 101 | unsigned char *color_indexes, | 
|---|
| 102 | int *color_table, | 
|---|
| 103 | void *frame_buffer); | 
|---|
| 104 |  | 
|---|
| 105 |  | 
|---|
| 106 | void ZB_close(ZBuffer *zb); | 
|---|
| 107 |  | 
|---|
| 108 | void ZB_resize(ZBuffer *zb,void *frame_buffer,int xsize,int ysize); | 
|---|
| 109 | void ZB_clear(ZBuffer *zb,int clear_z,int z, | 
|---|
| 110 | int clear_color,int r,int g,int b); | 
|---|
| 111 | /* linesize is in BYTES */ | 
|---|
| 112 | void ZB_copyFrameBuffer(ZBuffer *zb,void *buf,int linesize); | 
|---|
| 113 |  | 
|---|
| 114 | /* zdither.c */ | 
|---|
| 115 |  | 
|---|
| 116 | void ZB_initDither(ZBuffer *zb,int nb_colors, | 
|---|
| 117 | unsigned char *color_indexes,int *color_table); | 
|---|
| 118 | void ZB_closeDither(ZBuffer *zb); | 
|---|
| 119 | void ZB_ditherFrameBuffer(ZBuffer *zb,unsigned char *dest, | 
|---|
| 120 | int linesize); | 
|---|
| 121 |  | 
|---|
| 122 | /* zline.c */ | 
|---|
| 123 |  | 
|---|
| 124 | void ZB_plot(ZBuffer *zb,ZBufferPoint *p); | 
|---|
| 125 | void ZB_line(ZBuffer *zb,ZBufferPoint *p1,ZBufferPoint *p2); | 
|---|
| 126 | void ZB_line_z(ZBuffer * zb, ZBufferPoint * p1, ZBufferPoint * p2); | 
|---|
| 127 |  | 
|---|
| 128 | /* ztriangle.c */ | 
|---|
| 129 |  | 
|---|
| 130 | void ZB_setTexture(ZBuffer *zb, PIXEL *texture); | 
|---|
| 131 |  | 
|---|
| 132 | void ZB_fillTriangleFlat(ZBuffer *zb, | 
|---|
| 133 | ZBufferPoint *p1,ZBufferPoint *p2,ZBufferPoint *p3); | 
|---|
| 134 |  | 
|---|
| 135 | void ZB_fillTriangleSmooth(ZBuffer *zb, | 
|---|
| 136 | ZBufferPoint *p1,ZBufferPoint *p2,ZBufferPoint *p3); | 
|---|
| 137 |  | 
|---|
| 138 | void ZB_fillTriangleMapping(ZBuffer *zb, | 
|---|
| 139 | ZBufferPoint *p1,ZBufferPoint *p2,ZBufferPoint *p3); | 
|---|
| 140 |  | 
|---|
| 141 | void ZB_fillTriangleMappingPerspective(ZBuffer *zb, | 
|---|
| 142 | ZBufferPoint *p0,ZBufferPoint *p1,ZBufferPoint *p2); | 
|---|
| 143 |  | 
|---|
| 144 |  | 
|---|
| 145 | typedef void (*ZB_fillTriangleFunc)(ZBuffer  *, | 
|---|
| 146 | ZBufferPoint *,ZBufferPoint *,ZBufferPoint *); | 
|---|
| 147 |  | 
|---|
| 148 | /* memory.c */ | 
|---|
| 149 | void gl_free(void *p); | 
|---|
| 150 | void *gl_malloc(int size); | 
|---|
| 151 | void *gl_zalloc(int size); | 
|---|
| 152 |  | 
|---|
| 153 | #endif /* _tgl_zbuffer_h_ */ | 
|---|