Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
5730 pavelyakov 1
#ifndef INCLUDE_FONT_H
2
#define INCLUDE_FONT_H
3
 
4
#ifndef INCLUDE_MATH_H
5
#include "../lib/math.h"
6
#endif
7
 
8
#ifndef INCLUDE_IO_H
9
#include "../lib/io.h"
10
#endif
11
 
12
:struct FONT
13
{
5740 pavelyakov 14
	byte width,height,offsetLine,r,g,b;
15
	word width_buffer;
5736 pavelyakov 16
	dword file_size;
5740 pavelyakov 17
	dword buffer;
5730 pavelyakov 18
	word block;
19
	dword data;
5736 pavelyakov 20
	dword begin;
5730 pavelyakov 21
	dword size_file;
22
	byte load(...);
5740 pavelyakov 23
	byte symbol(word x;byte s;dword c);
5736 pavelyakov 24
	dword text(word x,y;dword text,c;byte size);
25
	dword textarea(word x,y;dword text,c;byte size);
26
	byte changeSIZE(byte size);
5740 pavelyakov 27
	void PixelRGB(word x,y);
28
	dword tmp_y,tmp_height,tmp_x;
5730 pavelyakov 29
};
30
FONT font = 0;
5740 pavelyakov 31
 
32
:void FONT::PixelRGB(dword x,y)
33
{
34
	dword tmp;
35
	tmp = y*width_buffer*3;
36
	tmp += x*3;
37
	tmp += buffer;
38
 
39
	DSBYTE[tmp] = r;
40
	tmp++;
41
	DSBYTE[tmp] = g;
42
	tmp++;
43
	DSBYTE[tmp] = b;
44
}
5736 pavelyakov 45
:byte FONT::changeSIZE(byte size)
5730 pavelyakov 46
{
5736 pavelyakov 47
	dword TMP_DATA;
48
	dword ofs;
49
	byte s;
50
	IF(size<9) size = 8;
51
	IF(size>45)size = 45;
52
		s = size-8;
53
		data = begin;
54
		TMP_DATA = data;
55
		TMP_DATA +=s*4;
56
		ofs = DSDWORD[TMP_DATA];
57
		IF(ofs==-1)return false;
58
		data += ofs;
59
		data += 156;
60
		TMP_DATA = data;
61
		file_size = DSDWORD[TMP_DATA];
62
		TMP_DATA += file_size;
63
		TMP_DATA--;
64
		height = DSBYTE[TMP_DATA];
65
		TMP_DATA--;
66
		width =  DSBYTE[TMP_DATA];
67
		block = math.ceil(height*width/32);
68
		return true;
69
}
5740 pavelyakov 70
:proc_info Form_SELF_FONTS;
5736 pavelyakov 71
:dword FONT::text(word x,y;dword text1,c;byte size)
72
{
5730 pavelyakov 73
	dword len=0;
5736 pavelyakov 74
	if(size)if(!changeSIZE(size))return 0;
5740 pavelyakov 75
	GetProcessInfo(#Form_SELF_FONTS, SelfInfo);
76
	//tmp_height = height;
77
	//tmp_y = 0;
78
	AX = c;
79
	r = AL;
80
	g = AH;
81
	c>>=16;
82
	AX = c;
83
	b = AL;
84
	width_buffer = width;
85
	width_buffer *= strlen(text1);
86
	buffer = malloc(width_buffer*height);
87
	width_buffer /= 3;
88
	CopyScreen(buffer,x+Form_SELF_FONTS.left+5,y+Form_SELF_FONTS.top+GetSkinHeight(),width_buffer,height);
5736 pavelyakov 89
 
5730 pavelyakov 90
	WHILE(DSBYTE[text1])
91
	{
5740 pavelyakov 92
		len += symbol(len,DSBYTE[text1],c);
5730 pavelyakov 93
		text1++;
94
	}
5740 pavelyakov 95
	_PutImage(x,y,width_buffer,height,buffer);
96
	free(buffer);
5730 pavelyakov 97
	return len;
98
}
5736 pavelyakov 99
:dword FONT::textarea(word x,y;dword text1,c;byte size)
5730 pavelyakov 100
{
5740 pavelyakov 101
 
5730 pavelyakov 102
}
5740 pavelyakov 103
:byte FONT::symbol(signed x;byte s;dword c)
5730 pavelyakov 104
{
5736 pavelyakov 105
        dword xi,yi;
106
        dword tmp,_;
107
        dword iii;
5740 pavelyakov 108
		dword ___;
5736 pavelyakov 109
        byte rw=0;
110
        IF(s==32)return width/4;
111
		IF(s==9)return width;
112
        yi = 0;
113
        iii = 0;
114
        tmp = 4*block*s;
115
        tmp +=data;
5740 pavelyakov 116
        WHILE(yi
5736 pavelyakov 117
        {
118
                xi = 0;
119
                WHILE(xi
120
                {
5740 pavelyakov 121
						/*IF(x+width>Form_SELF_FONTS.cwidth)
122
						{
123
							tmp_y+=height;
124
							tmp_height += height;
125
							tmp_x = x;
126
						}*/
127
                        IF(iii%32) _ >>= 1;
128
						ELSE
129
						{
5736 pavelyakov 130
                                tmp += 4;
131
                                _ = DSDWORD[tmp];
132
                        }
133
                        IF(_&1)
134
                        {
135
                                IF(xi>rw)rw=xi;
5740 pavelyakov 136
								//PixelRGB(x+xi-tmp_x,tmp_y+yi);
137
								PixelRGB(x+xi,yi);
5736 pavelyakov 138
                        }
139
                        xi++;
140
                        iii++;
141
                }
142
                yi++;
143
        }
144
        return rw;
5730 pavelyakov 145
}
146
:byte FONT::load(dword path)
147
{
148
	dword tmp;
149
	IF(data)free(data);
150
	tmp = io.read(path);
151
	data = tmp;
5736 pavelyakov 152
	begin = data;
5730 pavelyakov 153
	size_file = io.FILES_SIZE;
154
	tmp +=size_file;
155
	tmp--;
156
	height = DSBYTE[tmp];
157
	tmp--;
158
	width = DSBYTE[tmp];
159
	block = math.ceil(height*width/32);
160
}
161
 
162
#endif