Subversion Repositories Kolibri OS

Rev

Rev 5598 | Rev 5678 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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