Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  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. /*
  149.  * Memory allocator for TinyGL
  150.  */
  151.  
  152. /* modify these functions so that they suit your needs */
  153.  
  154. static inline void gl_free(void *p)
  155. {
  156.     free(p);    
  157. }
  158.  
  159. static inline void *gl_malloc(int size)
  160. {
  161.     return malloc(size);    
  162. }
  163.  
  164. static inline void *gl_zalloc(int size)
  165. {    
  166.     return calloc(1, size);
  167. }
  168.  
  169. #endif /* _tgl_zbuffer_h_ */
  170.