Subversion Repositories Kolibri OS

Rev

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