Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
7254 leency 1
#define MAX_CELL_SIZE 256
2
 
7155 leency 3
struct _image
7089 leency 4
{
5
	unsigned rows, columns;
7254 leency 6
	dword mas[MAX_CELL_SIZE*MAX_CELL_SIZE];
7151 leency 7
	dword img;
7155 leency 8
	void create();
7151 leency 9
	void set_pixel();
7254 leency 10
	void draw_line();
11
	void fill();
7156 leency 12
	void set_image();
7151 leency 13
	dword get_pixel();
7089 leency 14
	dword get_image();
7096 leency 15
	void move();
7150 leency 16
};
7089 leency 17
 
7155 leency 18
void _image::create(int _rows, _columns)
7089 leency 19
{
7155 leency 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
{
7151 leency 28
	mas[columns*_r + _c] = _color;
7089 leency 29
}
30
 
7254 leency 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
97
				IF (r
98
 
99
				IF (get_pixel(r,c)==MARKED) restart=true;
100
			}
101
	}while(restart);
102
 
103
	for (i=0; i
104
			IF (mas[i]==MARKED) mas[i] = _color;
105
}
106
 
7155 leency 107
dword _image::get_pixel(int _r, _c)
7089 leency 108
{
7151 leency 109
	return mas[columns*_r + _c];
7089 leency 110
}
111
 
7156 leency 112
void _image::set_image(dword _inbuf)
113
{
114
	dword i;
115
	for (i = 0; i < columns*rows; i++;)
116
	{
7190 leency 117
		// mas[i] = ESDWORD[i*4+_inbuf] & 0x00FFFFFF; //for x32 bit color
118
		mas[i] = ESDWORD[i*3+_inbuf] & 0xFFFFFF;
7156 leency 119
	}
120
}
121
 
7155 leency 122
dword _image::get_image()
7089 leency 123
{
124
	int r=0, c=0;
125
	dword i;
126
 
7151 leency 127
	free(img);
128
	i = img = malloc(rows*columns*3);
7089 leency 129
 
130
	for (r = 0; r < rows; r++)
131
		for (c = 0; c < columns; c++)
132
		{
7151 leency 133
			rgb.DwordToRgb(get_pixel(r,c));
7089 leency 134
			ESBYTE[i] = rgb.b;
135
			ESBYTE[i+1] = rgb.g;
136
			ESBYTE[i+2] = rgb.r;
137
			i += 3;
138
		}
7151 leency 139
	return img;
7089 leency 140
}
141
 
7096 leency 142
enum {
7151 leency 143
	MOVE_LEFT,
144
	MOVE_RIGHT,
145
	MOVE_UP,
146
	MOVE_DOWN,
147
	FLIP_VER,
148
	FLIP_HOR,
149
	ROTE
7096 leency 150
};
7155 leency 151
void _image::move(int _direction)
7096 leency 152
{
153
	int r, c;
154
	dword first_element_data;
155
 
7154 leency 156
	switch(_direction)
7096 leency 157
	{
7154 leency 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;
7096 leency 206
	}
207
}
7147 leency 208