Subversion Repositories Kolibri OS

Rev

Rev 7190 | Rev 7257 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. #define MAX_CELL_SIZE 256
  2.  
  3. struct _image
  4. {
  5.         unsigned rows, columns;
  6.         dword mas[MAX_CELL_SIZE*MAX_CELL_SIZE];
  7.         dword img;
  8.         void create();
  9.         void set_pixel();
  10.         void draw_line();
  11.         void fill();
  12.         void set_image();
  13.         dword get_pixel();
  14.         dword get_image();
  15.         void move();
  16. };
  17.  
  18. void _image::create(int _rows, _columns)
  19. {
  20.         int i;
  21.         rows = _rows;
  22.         columns = _columns;
  23.         for (i = 0; i < columns*rows; i++) mas[i]=0xBFCAD2;
  24. }
  25.  
  26. void _image::set_pixel(int _r, _c, _color)
  27. {
  28.         mas[columns*_r + _c] = _color;
  29. }
  30.  
  31. void _image::draw_line(int x1, int y1, int x2, int y2, dword color) {
  32.         int dx, dy, signX, signY, error, error2;
  33.  
  34.         dx = x2 - x1;
  35.  
  36.         if (dx < 0)
  37.                 dx = -dx;
  38.    
  39.         dy = y2 - y1;
  40.  
  41.         if (dy < 0)
  42.                 dy = -dy;
  43.    
  44.         if (x1 < x2)
  45.                 signX = 1;
  46.         else
  47.                 signX = -1;
  48.    
  49.         if (y1 < y2)
  50.                 signY = 1;
  51.         else
  52.                 signY = -1;
  53.    
  54.         error = dx - dy;
  55.  
  56.         set_pixel(y2, x2, color);
  57.  
  58.         while((x1 != x2) || (y1 != y2))
  59.         {
  60.                 set_pixel(y1, x1, color);
  61.                
  62.                 error2 = error * 2;
  63.  
  64.                 if(error2 > calc(-dy))
  65.                 {
  66.                         error -= dy;
  67.                         x1 += signX;
  68.                 }
  69.  
  70.                 if(error2 < dx)
  71.                 {
  72.                         error += dx;
  73.                         y1 += signY;
  74.                 }
  75.         }
  76. }
  77.  
  78. void _image::fill(int _r, _c, _color)
  79. {
  80.         #define MARKED 6
  81.         int r, c, i, restart;
  82.  
  83.         dword old_color = get_pixel(_r, _c);
  84.         set_pixel(_r, _c, MARKED);
  85.  
  86.         do {
  87.                 restart=false; 
  88.                 for (r = 0; r < rows; r++)
  89.                         for (c = 0; c < columns; c++)
  90.                         {
  91.                                 IF (get_pixel(r,c) != old_color) continue;
  92.                                 IF (get_pixel(r,c) == MARKED) continue;
  93.                                
  94.                                 IF (c>0)               && (get_pixel(r,c-1) == MARKED) set_pixel(r,c,MARKED);
  95.                                 IF (r>0)               && (get_pixel(r-1,c) == MARKED) set_pixel(r,c,MARKED);
  96.                                 IF (c<columns-1) && (get_pixel(r,c+1) == MARKED) set_pixel(r,c,MARKED);
  97.                                 IF (r<rows-1)    && (get_pixel(r+1,c) == MARKED) set_pixel(r,c,MARKED);
  98.                                
  99.                                 IF (get_pixel(r,c)==MARKED) restart=true;
  100.                         }
  101.         }while(restart);
  102.  
  103.         for (i=0; i<columns*rows; i++)
  104.                         IF (mas[i]==MARKED) mas[i] = _color;
  105. }
  106.  
  107. dword _image::get_pixel(int _r, _c)
  108. {
  109.         return mas[columns*_r + _c];
  110. }
  111.  
  112. void _image::set_image(dword _inbuf)
  113. {
  114.         dword i;
  115.         for (i = 0; i < columns*rows; i++;)
  116.         {
  117.                 // mas[i] = ESDWORD[i*4+_inbuf] & 0x00FFFFFF; //for x32 bit color
  118.                 mas[i] = ESDWORD[i*3+_inbuf] & 0xFFFFFF;
  119.         }
  120. }
  121.  
  122. dword _image::get_image()
  123. {
  124.         int r=0, c=0;
  125.         dword i;
  126.  
  127.         free(img);
  128.         i = img = malloc(rows*columns*3);
  129.  
  130.         for (r = 0; r < rows; r++)
  131.                 for (c = 0; c < columns; c++)
  132.                 {
  133.                         rgb.DwordToRgb(get_pixel(r,c));
  134.                         ESBYTE[i] = rgb.b;
  135.                         ESBYTE[i+1] = rgb.g;
  136.                         ESBYTE[i+2] = rgb.r;
  137.                         i += 3;
  138.                 }
  139.         return img;
  140. }
  141.  
  142. enum {
  143.         MOVE_LEFT,
  144.         MOVE_RIGHT,
  145.         MOVE_UP,
  146.         MOVE_DOWN,
  147.         FLIP_VER,
  148.         FLIP_HOR,
  149.         ROTE
  150. };
  151. void _image::move(int _direction)
  152. {
  153.         int r, c;
  154.         dword first_element_data;
  155.  
  156.         switch(_direction)
  157.         {
  158.                 case MOVE_LEFT:
  159.                                 for (r = 0; r < rows; r++)
  160.                                 {
  161.                                         first_element_data = get_pixel(r, 0);
  162.                                         for (c = 0; c < columns-1; c++) set_pixel(r, c, get_pixel(r, c+1));
  163.                                         set_pixel(r, columns-1, first_element_data);
  164.                                 }
  165.                                 break;
  166.                 case MOVE_RIGHT:
  167.                                 for (r = 0; r < rows; r++)
  168.                                 {
  169.                                         first_element_data = get_pixel(r, columns-1);
  170.                                         for (c = columns-1; c > 0; c--) set_pixel(r, c, get_pixel(r, c-1));
  171.                                         set_pixel(r, 0, first_element_data);
  172.                                 }      
  173.                                 break; 
  174.                 case MOVE_UP:
  175.                                 for (c = 0; c < columns; c++)
  176.                                 {
  177.                                         first_element_data = get_pixel(0, c);
  178.                                         for (r = 0; r < rows-1; r++) set_pixel(r, c, get_pixel(r+1, c));
  179.                                         set_pixel(rows-1, c, first_element_data);
  180.                                 }      
  181.                                 break;
  182.                 case MOVE_DOWN:
  183.                                 for (c = 0; c < columns; c++)
  184.                                 {
  185.                                         first_element_data = get_pixel(rows-1, c);
  186.                                         for (r = rows-1; r > 0; r--) set_pixel(r, c, get_pixel(r-1, c));
  187.                                         set_pixel(0, c, first_element_data);
  188.                                 }
  189.                                 break;
  190.                 case FLIP_HOR:
  191.                                 for (r = 0; r < rows; r++)
  192.                                         for (c = 0; c < columns/2; c++) {
  193.                                                 first_element_data = get_pixel(r, c);
  194.                                                 set_pixel(r, c, get_pixel(r, columns-c-1));
  195.                                                 set_pixel(r, columns-c-1, first_element_data);
  196.                                         }
  197.                                 break;
  198.                 case FLIP_VER:
  199.                                 for (c = 0; c < columns; c++)
  200.                                         for (r = 0; r < rows/2; r++) {
  201.                                                 first_element_data = get_pixel(r, c);
  202.                                                 set_pixel(r, c, get_pixel(rows-r-1, c));
  203.                                                 set_pixel(rows-r-1, c, first_element_data);
  204.                                         }
  205.                                 break; 
  206.         }
  207. }
  208.  
  209.  
  210.  
  211.  
  212.  
  213.  
  214.  
  215.