Advertisement
Guest User

rasterizer.c

a guest
Nov 26th, 2014
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.31 KB | None | 0 0
  1. #include "rasterizer.h"
  2.  
  3. void clearFrameBuffer(u8 *fb, u32 color)
  4. {
  5.     u8* i = fb;
  6.     u8* c_inf = (u8*)&color;
  7.    
  8.     for (i; i < fb + (240*400*3); i += 3)
  9.     {
  10.         *i = c_inf[3];
  11.         *(i+1) = c_inf[2];
  12.         *(i+2) = c_inf[1];
  13.     }
  14. }
  15.  
  16. void pixel2D(u8* fb, u16 x, u16 y, u32 color)
  17. {    
  18.     u8 *p = (u32*)(fb + (3 * (y + (x * 240))));
  19.     u8* c_inf = (u8*)&color;
  20.     if (fb && x >= 0 && x < 240 && y >= 0 && y < 400)
  21.     {  
  22.         *p = c_inf[3];
  23.         *++p = c_inf[2];
  24.         *++p = c_inf[1];
  25.     }
  26. }
  27.  
  28. void box2D(u8 *fb, u16 x1, u16 y1, u16 w, u16 h, u32 color)
  29. {
  30.     if (!fb)
  31.         return;
  32.    
  33.     u16 x, y;
  34.     u8* c_inf = (u8*)&color;
  35.    
  36.     for (y = y1; y <= y1+h; y++)
  37.     {
  38.         fb[3 * (y + (x1*240))] = c_inf[3];
  39.         fb[3 * (y + (x1*240)) + 1] = c_inf[2];
  40.         fb[3 * (y + (x1*240)) + 2] = c_inf[1];
  41.      
  42.         fb[3 * (y + ((x1+w)*240))] = c_inf[3];
  43.         fb[3 * (y + ((x1+w)*240)) + 1] = c_inf[2];
  44.         fb[3 * (y + ((x1+w)*240)) + 2] = c_inf[1];
  45.     }
  46.  
  47.     for (x = x1 + 1; x < x1 + w; x++)
  48.     {
  49.         fb[3 * (y1 + (x*240))] = c_inf[3];
  50.         fb[3 * (y1 + (x*240)) + 1] = c_inf[2];
  51.         fb[3 * (y1 + (x*240)) + 2] = c_inf[1];
  52.      
  53.         fb[3 * ((y1+h) + (x*240))] = c_inf[3];
  54.         fb[3 * ((y1+h) + (x*240)) + 1] = c_inf[2];
  55.         fb[3 * ((y1+h) + (x*240)) + 2] = c_inf[1];
  56.     }
  57. }
  58.  
  59. void fillBox2D(u8 *fb, u16 x, u16 y, u16 w, u16 h, u32 color)
  60. {
  61.     if (!fb)
  62.         return;
  63.    
  64.     if (x >= 0 && x + w < 400 && y >= 0 && y + h < 240)
  65.     {
  66.         u8 *c_inf = (u8*)&color;
  67.         int i;
  68.         int ii;
  69.         int tmp_x;
  70.        
  71.         for (i=x; i < x + w; i++)
  72.         {
  73.             tmp_x = i*240;
  74.             for (ii=y; ii < y + h; ii++)
  75.             {
  76.                 fb[3 * (ii + tmp_x)] = c_inf[3];
  77.                 fb[3 * (ii + tmp_x) + 1] = c_inf[2];
  78.                 fb[3 * (ii + tmp_x) + 2] = c_inf[1];
  79.             }
  80.         }
  81.            
  82.     }
  83. }
  84.  
  85. void line2D(u8* fb, u16 x1, u16 y1, u16 x2, u16 y2, u32 color)
  86. {
  87.     // Based upon bresenham implementation from wikipedia (de))
  88.     if (!fb)
  89.         return;
  90.    
  91.     u8* c_inf = (u8*)&color;
  92.     s32 x, y, t, dx, dy, incx, incy, pdx, pdy, ddx, ddy, es, el, err;
  93.    
  94.     dx = x2 - x1;
  95.     dy = y2 - y1;
  96.    
  97.     incx = (dx > 0) ? 1 : (dx < 0) ? -1 : 0;;
  98.     incy = (dy > 0) ? 1 : (dy < 0) ? -1 : 0;;
  99.  
  100.     if(dx<0) dx = -dx;
  101.     if(dy<0) dy = -dy;
  102.  
  103.     if (dx>dy) {
  104.             pdx=incx; pdy=0;
  105.             ddx=incx; ddy=incy;
  106.             es =dy;   el =dx;
  107.     }
  108.     else {
  109.             pdx=0;    pdy=incy;
  110.             ddx=incx; ddy=incy;
  111.             es =dx;   el =dy;
  112.     }
  113.  
  114.     x = x1;
  115.     y = y1;
  116.     err = el/2;
  117.  
  118.     fb[3 * (y + (x*240))] = c_inf[3];
  119.     fb[3 * (y + (x*240))+1] = c_inf[2];
  120.     fb[3 * (y + (x*240))+2] = c_inf[1];
  121.  
  122.     //setPixel(dp, x, y, c);
  123.  
  124.     for(t=0; t<el; ++t) {
  125.  
  126.             err -= es;
  127.  
  128.             if(err<0) {
  129.                     err += el;
  130.                     x += ddx;
  131.                     y += ddy;
  132.             }
  133.             else {
  134.                     x += pdx;
  135.                     y += pdy;
  136.             }
  137.  
  138.             //setPixel(dp, x, y, c);
  139.             fb[3 * (y + (x*240))] = c_inf[3];
  140.             fb[3 * (y + (x*240))+1] = c_inf[2];
  141.             fb[3 * (y + (x*240))+2] = c_inf[1];
  142.     }
  143. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement