Subversion Repositories Kolibri OS

Rev

Rev 5296 | 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
 
5296 ZblCoder 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
 
5276 ZblCoder 64
void CKosImage::Draw(Point position, float angle)
65
{
66
	float alpha;
5296 ZblCoder 67
	Point p, p1, p2;
5276 ZblCoder 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
 
5296 ZblCoder 89
	for (int y = 0; y < this->height; ++y)
90
		for (int x = 0; x < this->width; ++x)
5276 ZblCoder 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
 
5296 ZblCoder 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)
5276 ZblCoder 101
			{
102
				p.Y += this->frame * this->frameHeight;
103
				addPixel = this->buffer[this->getPixel(p.X, p.Y)];
5296 ZblCoder 104
				PixelID = this->render->getPixel(p2.X, p2.Y);
5276 ZblCoder 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
 
5474 ZblCoder 118
					if (this->mode == DRAW_ALPHA)
5276 ZblCoder 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
5474 ZblCoder 125
						if (this->mode == DRAW_ALPHA_ADD)
5276 ZblCoder 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
}