Subversion Repositories Kolibri OS

Rev

Rev 5276 | Rev 5296 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5281 ZblCoder 1
#include "smalllibc/kosSyst.h"
5276 ZblCoder 2
#include "render.h"
5281 ZblCoder 3
#include "smalllibc/func.h"
5276 ZblCoder 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
}