Subversion Repositories Kolibri OS

Rev

Rev 5519 | Rev 5676 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5519 Rev 5598
-
 
1
#ifndef INCLUDE_DRAW_BUF_H
-
 
2
#define INCLUDE_DRAW_BUF_H
-
 
3
 
-
 
4
#ifndef INCLUDE_KOLIBRI_H
-
 
5
#include "../lib/kolibri.h"
-
 
6
#endif
1
dword buf_data;
7
 
2
dword zbuf_data;
8
dword buf_data;
3
 
9
dword zbuf_data;
4
 
10
 
5
struct DrawBufer {
11
 
6
	int bufx, bufy, bufw, bufh;
12
struct DrawBufer {
7
	int zbufx, zbufy, zbufw, zbufh;
13
	int bufx, bufy, bufw, bufh;
8
	byte zoomf;
14
	int zbufx, zbufy, zbufw, zbufh;
9
 
15
	byte zoomf;
10
	void Init();
16
 
11
	void Show();
17
	void Init();
12
	void Fill();
18
	void Show();
13
	void Skew();
19
	void Fill();
14
	void DrawBar();
20
	void Skew();
15
	void PutPixel();
21
	void DrawBar();
16
	void AlignCenter();
22
	void PutPixel();
17
	void AlignRight();
23
	void AlignCenter();
18
	void Zoom2x();
24
	void AlignRight();
19
};
25
	void Zoom2x();
20
 
26
};
21
void DrawBufer::Init(int i_bufx, i_bufy, i_bufw, i_bufh)
27
 
22
{
28
void DrawBufer::Init(int i_bufx, i_bufy, i_bufw, i_bufh)
23
	bufx = i_bufx;
29
{
24
	bufy = i_bufy;
30
	bufx = i_bufx;
25
	bufw = i_bufw; 
31
	bufy = i_bufy;
26
	bufh = i_bufh;
32
	bufw = i_bufw; 
27
	free(buf_data);
33
	bufh = i_bufh;
28
	buf_data = malloc(bufw * bufh * 4 + 8);
34
	free(buf_data);
29
	ESDWORD[buf_data] = bufw;
35
	buf_data = malloc(bufw * bufh * 4 + 8);
30
	ESDWORD[buf_data+4] = bufh;
36
	ESDWORD[buf_data] = bufw;
31
 
37
	ESDWORD[buf_data+4] = bufh;
32
	if (zoomf != 1)
38
 
33
	{
39
	if (zoomf != 1)
34
		zbufx = bufx;
40
	{
35
		zbufy = bufy;
41
		zbufx = bufx;
36
		zbufw = bufw * zoomf;
42
		zbufy = bufy;
37
		zbufh = bufh * zoomf;
43
		zbufw = bufw * zoomf;
38
		free(zbuf_data);
44
		zbufh = bufh * zoomf;
39
		zbuf_data = malloc(zbufw * zbufh * 4 + 8);
45
		free(zbuf_data);
40
		ESDWORD[zbuf_data] = zbufw;
46
		zbuf_data = malloc(zbufw * zbufh * 4 + 8);
41
		ESDWORD[zbuf_data+4] = zbufh;
47
		ESDWORD[zbuf_data] = zbufw;
42
	}
48
		ESDWORD[zbuf_data+4] = zbufh;
43
}
49
	}
44
 
50
}
45
void DrawBufer::Fill(dword fill_color)
51
 
46
{
52
void DrawBufer::Fill(dword fill_color)
47
	int i;
53
{
48
	int max_i = bufw * bufh * 4 + buf_data + 8;
54
	int i;
49
	for (i=buf_data+8; i
55
	int max_i = bufw * bufh * 4 + buf_data + 8;
50
}
56
	for (i=buf_data+8; i
51
 
57
}
52
void DrawBufer::DrawBar(dword x, y, w, h, color)
58
 
53
{
59
void DrawBufer::DrawBar(dword x, y, w, h, color)
54
	int i, j;
60
{
55
	for (j=0; j
61
	int i, j;
56
	{
62
	for (j=0; j
57
		for (i = y+j*bufw+x*4+8+buf_data; i
63
	{
58
	}
64
		for (i = y+j*bufw+x*4+8+buf_data; i
59
}
65
	}
60
 
66
}
61
void DrawBufer::PutPixel(dword x, y, color)
67
 
62
{
68
void DrawBufer::PutPixel(dword x, y, color)
63
	int pos = y*bufw+x*4+8+buf_data;
69
{
64
	ESDWORD[pos] = color;
70
	int pos = y*bufw+x*4+8+buf_data;
65
}
71
	ESDWORD[pos] = color;
66
 
72
}
67
char shift[]={8,8,4,4};
73
 
68
void DrawBufer::Skew(dword x, y, w, h)
74
char shift[]={8,8,4,4};
69
{
75
void DrawBufer::Skew(dword x, y, w, h)
70
	int i, j;
76
{
71
	for (j=0; j<=3; j++)
77
	int i, j;
72
	{
78
	for (j=0; j<=3; j++)
73
		for (i = y+j*bufw+x+w+h*4; i>y+j*bufw+x+h-12*4 ; i-=4)
79
	{
74
								ESDWORD[buf_data+i+8] = ESDWORD[-shift[j]+buf_data+i+8];
80
		for (i = y+j*bufw+x+w+h*4; i>y+j*bufw+x+h-12*4 ; i-=4)
75
	}
81
								ESDWORD[buf_data+i+8] = ESDWORD[-shift[j]+buf_data+i+8];
76
}
82
	}
77
 
83
}
78
void DrawBufer::AlignRight(dword x,y,w,h, content_width)
84
 
79
{
85
void DrawBufer::AlignRight(dword x,y,w,h, content_width)
80
	int i, j, l;
86
{
81
	int content_left = w - content_width / 2;
87
	int i, j, l;
82
	for (j=0; j
88
	int content_left = w - content_width / 2;
83
	{
89
	for (j=0; j
84
		for (i=j*w+w-x*4, l=j*w+content_width+x*4; (i>=j*w+content_left*4) && (l>=j*w*4); i-=4, l-=4)
90
	{
85
		{
91
		for (i=j*w+w-x*4, l=j*w+content_width+x*4; (i>=j*w+content_left*4) && (l>=j*w*4); i-=4, l-=4)
86
			ESDWORD[buf_data+8+i] >< ESDWORD[buf_data+8+l];
92
		{
87
		}
93
			ESDWORD[buf_data+8+i] >< ESDWORD[buf_data+8+l];
88
	}
94
		}
89
}
95
	}
90
 
96
}
91
void DrawBufer::AlignCenter(dword x,y,w,h, content_width)
97
 
92
{
98
void DrawBufer::AlignCenter(dword x,y,w,h, content_width)
93
	int i, j, l;
99
{
94
	int content_left = w - content_width / 2;
100
	int i, j, l;
95
	for (j=0; j
101
	int content_left = w - content_width / 2;
96
	{
102
	for (j=0; j
97
		for (i=j*w+content_width+content_left*4, l=j*w+content_width+x*4; (i>=j*w+content_left*4) && (l>=j*w*4); i-=4, l-=4)
103
	{
98
		{
104
		for (i=j*w+content_width+content_left*4, l=j*w+content_width+x*4; (i>=j*w+content_left*4) && (l>=j*w*4); i-=4, l-=4)
99
			ESDWORD[buf_data+8+i] >< ESDWORD[buf_data+8+l];
105
		{
100
		}
106
			ESDWORD[buf_data+8+i] >< ESDWORD[buf_data+8+l];
101
	}
107
		}
102
}
108
	}
103
 
109
}
104
 
110
 
105
void DrawBufer::Zoom2x()
111
 
106
{
112
void DrawBufer::Zoom2x()
107
	int i, s;
113
{
108
	dword point_x, max_i, zline_w, s_inc;
114
	int i, s;
109
 
115
	dword point_x, max_i, zline_w, s_inc;
110
	point_x = 0;
116
 
111
	max_i = bufw * bufh * 4 + buf_data+8;
117
	point_x = 0;
112
	s_inc = zoomf * 4;
118
	max_i = bufw * bufh * 4 + buf_data+8;
113
	zline_w = zbufw * 4;
119
	s_inc = zoomf * 4;
114
 
120
	zline_w = zbufw * 4;
115
	for (i=buf_data+8, s=zbuf_data+8; i
121
 
116
		ESDWORD[s] = ESDWORD[i];
122
	for (i=buf_data+8, s=zbuf_data+8; i
117
		ESDWORD[s+4] = ESDWORD[i];
123
		ESDWORD[s] = ESDWORD[i];
118
		ESDWORD[s+zline_w] = ESDWORD[i];
124
		ESDWORD[s+4] = ESDWORD[i];
119
		ESDWORD[s+zline_w+4] = ESDWORD[i];
125
		ESDWORD[s+zline_w] = ESDWORD[i];
120
		if (zoomf==3)
126
		ESDWORD[s+zline_w+4] = ESDWORD[i];
121
		{
127
		if (zoomf==3)
122
			ESDWORD[s+8] = ESDWORD[i];
128
		{
123
			ESDWORD[zline_w+s+8] = ESDWORD[i];
129
			ESDWORD[s+8] = ESDWORD[i];
124
			ESDWORD[zline_w*2+s] = ESDWORD[i];
130
			ESDWORD[zline_w+s+8] = ESDWORD[i];
125
			ESDWORD[zline_w*2+s+4] = ESDWORD[i];
131
			ESDWORD[zline_w*2+s] = ESDWORD[i];
126
			ESDWORD[zline_w*2+s+8] = ESDWORD[i];
132
			ESDWORD[zline_w*2+s+4] = ESDWORD[i];
127
		}
133
			ESDWORD[zline_w*2+s+8] = ESDWORD[i];
128
 
134
		}
129
		point_x++;
135
 
130
		if (point_x >= bufw) 
136
		point_x++;
131
		{
137
		if (point_x >= bufw) 
132
			s += zoomf - 1 * zline_w;
138
		{
133
			point_x = 0;
139
			s += zoomf - 1 * zline_w;
134
		}
140
			point_x = 0;
135
	}
141
		}
136
}
142
	}
137
 
143
}
138
 
144
 
139
void DrawBufer::Show()
145
 
140
{
146
void DrawBufer::Show()
141
	if (zoomf == 1)
147
{
142
	{
148
	if (zoomf == 1)
143
		PutPaletteImage(buf_data+8, bufw, bufh, bufx, bufy, 32, 0);
149
	{
144
	}
150
		PutPaletteImage(buf_data+8, bufw, bufh, bufx, bufy, 32, 0);
145
	else
151
	}
146
	{
152
	else
147
		Zoom2x();
153
	{
148
		PutPaletteImage(zbuf_data+8, zbufw, zbufh, zbufx, zbufy, 32, 0);
154
		Zoom2x();
149
	}		
155
		PutPaletteImage(zbuf_data+8, zbufw, zbufh, zbufx, zbufy, 32, 0);
150
}
156
	}		
151
157
}
-
 
158
 
-
 
159
#endif
152
160