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 "kosSyst.h"
  2. #include "render.h"
  3. #include <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)
  56. {
  57.         float alpha;
  58.         Point p, p1;
  59.         RGB pixel, newPixel;
  60.         RGBA addPixel;
  61.         int PixelID;
  62.         Point fix;
  63.         if (angle == 270)
  64.                 fix = Point(0, -1);
  65.         else
  66.                 if (angle == 180)
  67.                         fix = Point(-1, -1);
  68.                 else
  69.                         if (angle == 90)
  70.                                 fix = Point(-1, 0);
  71.                         else
  72.                                 fix = Point(0, 0);
  73.        
  74.         Point center = Point(this->width / 2, this->height / 2);
  75.         double a = -angle * (3.14 / 180);
  76.        
  77.         double SinRad = sin(a);
  78.         double CosRad = cos(a);
  79.  
  80.         for (int y = 0; y < 24; ++y)
  81.                 for (int x = 0; x < 24; ++x)
  82.                 {
  83.                         p1 = Point(x, y) - center;
  84.  
  85.                         p.X = roundInt(p1.X * CosRad - p1.Y * SinRad) + center.X;
  86.                         p.Y = roundInt(p1.X * SinRad + p1.Y * CosRad) + center.Y;
  87.  
  88.                         if (p.X >= 0 && p.X < this->width && p.Y >= 0 && p.Y < this->height)
  89.                         {
  90.                                 p.Y += this->frame * this->frameHeight;
  91.                                 addPixel = this->buffer[this->getPixel(p.X, p.Y)];
  92.                                 PixelID = this->render->getPixel(x + fix.X, y + fix.Y);
  93.                                 pixel = this->render->buffer[PixelID];
  94.  
  95.                                 if (addPixel.a > 0)
  96.                                 {
  97.                                         if (this->isColor)
  98.                                         {
  99.                                                 addPixel.r = this->color.r;
  100.                                                 addPixel.g = this->color.g;
  101.                                                 addPixel.b = this->color.b;
  102.                                         }
  103.  
  104.                                         alpha = (float)addPixel.a / 255.0f;
  105.  
  106.                                         if (this->mode = DRAW_ALPHA)
  107.                                         {
  108.                                                 newPixel.r = di((double)(pixel.r * (1 - alpha) + addPixel.r * alpha));
  109.                                                 newPixel.g = di((double)(pixel.g * (1 - alpha) + addPixel.g * alpha));
  110.                                                 newPixel.b = di((double)(pixel.b * (1 - alpha) + addPixel.b * alpha));
  111.                                         }
  112.                                         else
  113.                                                 if (this->mode = DRAW_ALPHA_ADD)
  114.                                                 {
  115.                                                         newPixel.r = di(min(255, (double)(pixel.r * (1 - alpha) + addPixel.r * alpha)));
  116.                                                         newPixel.g = di(min(255, (double)(pixel.g * (1 - alpha) + addPixel.g * alpha)));
  117.                                                         newPixel.b = di(min(255, (double)(pixel.b * (1 - alpha) + addPixel.b * alpha)));
  118.                                                 }
  119.                                                 else
  120.                                                 {
  121.                                                         newPixel.r = addPixel.r;
  122.                                                         newPixel.g = addPixel.g;
  123.                                                         newPixel.b = addPixel.b;
  124.                                                 }
  125.  
  126.                                         this->render->buffer[PixelID] = newPixel;
  127.                                 }
  128.                         }
  129.                 }
  130. }
  131.