Subversion Repositories Kolibri OS

Rev

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

  1. #include "smalllibc/kosSyst.h"
  2. #include "render.h"
  3. #include "smalllibc/func.h"
  4. #include "image.h"
  5. //#include "mymath.h"
  6.  
  7. CKosImage::CKosImage(CKosRender *render, RGBA *buffer, int width, int height)
  8. {
  9.         this->isColor = false;
  10.         this->width = width;
  11.         this->height = height;
  12.         this->buffer = buffer;
  13.         this->render = render;
  14.         this->mode = DRAW_ALPHA;
  15.         this->frame = 0;
  16.         this->frameWidth = 0;
  17.         this->frameHeight = 0;
  18. }
  19.  
  20. CKosImage::~CKosImage(void)
  21. {
  22.  
  23. }
  24.  
  25. void CKosImage::SetMode(int mode)
  26. {
  27.         this->mode = mode;
  28. }
  29.  
  30. void CKosImage::SetFrameSize(int width, int height)
  31. {
  32.         this->frameWidth = width;
  33.         this->frameHeight = height;
  34. }
  35.  
  36. void CKosImage::Draw(Point position, float angle, RGB color)
  37. {
  38.         this->isColor = true;
  39.         this->color = color;
  40.         this->Draw(position, angle);
  41.         this->isColor = false;
  42. }
  43.  
  44. int CKosImage::getPixel(int x, int y)
  45. {
  46.         return y * this->width + x;
  47. }
  48.  
  49. void CKosImage::Draw(Point position, float angle, int frame)
  50. {
  51.         this->frame = frame;
  52.         Draw(position, angle);
  53. }
  54.  
  55. void CKosImage::Draw(Point position, float angle, int frame, RGB color)
  56. {
  57.         this->isColor = true;
  58.         this->color = color;
  59.         this->frame = frame;
  60.         Draw(position, angle);
  61.         this->isColor = false;
  62. }
  63.  
  64. void CKosImage::Draw(Point position, float angle)
  65. {
  66.         float alpha;
  67.         Point p, p1, p2;
  68.         RGB pixel, newPixel;
  69.         RGBA addPixel;
  70.         int PixelID;
  71.         Point fix;
  72.         if (angle == 270)
  73.                 fix = Point(0, -1);
  74.         else
  75.                 if (angle == 180)
  76.                         fix = Point(-1, -1);
  77.                 else
  78.                         if (angle == 90)
  79.                                 fix = Point(-1, 0);
  80.                         else
  81.                                 fix = Point(0, 0);
  82.        
  83.         Point center = Point(this->width / 2, this->height / 2);
  84.         double a = -angle * (3.14 / 180);
  85.        
  86.         double SinRad = sin(a);
  87.         double CosRad = cos(a);
  88.  
  89.         for (int y = 0; y < this->height; ++y)
  90.                 for (int x = 0; x < this->width; ++x)
  91.                 {
  92.                         p1 = Point(x, y) - center;
  93.  
  94.                         p.X = roundInt(p1.X * CosRad - p1.Y * SinRad) + center.X;
  95.                         p.Y = roundInt(p1.X * SinRad + p1.Y * CosRad) + center.Y;
  96.  
  97.                         p2 = Point(x + fix.X + position.X, y + fix.Y + position.Y);
  98.  
  99.                         if (p.X >= 0 && p.X < this->width && p.Y >= 0 && p.Y < this->height
  100.                                 && p2.X >= 0 && p2.Y >= 0 && p2.X < this->render->width && p2.Y < this->render->height)
  101.                         {
  102.                                 p.Y += this->frame * this->frameHeight;
  103.                                 addPixel = this->buffer[this->getPixel(p.X, p.Y)];
  104.                                 PixelID = this->render->getPixel(p2.X, p2.Y);
  105.                                 pixel = this->render->buffer[PixelID];
  106.  
  107.                                 if (addPixel.a > 0)
  108.                                 {
  109.                                         if (this->isColor)
  110.                                         {
  111.                                                 addPixel.r = this->color.r;
  112.                                                 addPixel.g = this->color.g;
  113.                                                 addPixel.b = this->color.b;
  114.                                         }
  115.  
  116.                                         alpha = (float)addPixel.a / 255.0f;
  117.  
  118.                                         if (this->mode = DRAW_ALPHA)
  119.                                         {
  120.                                                 newPixel.r = di((double)(pixel.r * (1 - alpha) + addPixel.r * alpha));
  121.                                                 newPixel.g = di((double)(pixel.g * (1 - alpha) + addPixel.g * alpha));
  122.                                                 newPixel.b = di((double)(pixel.b * (1 - alpha) + addPixel.b * alpha));
  123.                                         }
  124.                                         else
  125.                                                 if (this->mode = DRAW_ALPHA_ADD)
  126.                                                 {
  127.                                                         newPixel.r = di(min(255, (double)(pixel.r * (1 - alpha) + addPixel.r * alpha)));
  128.                                                         newPixel.g = di(min(255, (double)(pixel.g * (1 - alpha) + addPixel.g * alpha)));
  129.                                                         newPixel.b = di(min(255, (double)(pixel.b * (1 - alpha) + addPixel.b * alpha)));
  130.                                                 }
  131.                                                 else
  132.                                                 {
  133.                                                         newPixel.r = addPixel.r;
  134.                                                         newPixel.g = addPixel.g;
  135.                                                         newPixel.b = addPixel.b;
  136.                                                 }
  137.  
  138.                                         this->render->buffer[PixelID] = newPixel;
  139.                                 }
  140.                         }
  141.                 }
  142. }
  143.