Subversion Repositories Kolibri OS

Rev

Rev 5730 | 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
{
14
	byte width,height,offsetLine;
5736 pavelyakov 15
	dword file_size;
5730 pavelyakov 16
	word block;
17
	dword data;
5736 pavelyakov 18
	dword begin;
5730 pavelyakov 19
	dword size_file;
20
	byte load(...);
21
	byte symbol(word x,y;byte s;dword c);
5736 pavelyakov 22
	dword text(word x,y;dword text,c;byte size);
23
	dword textarea(word x,y;dword text,c;byte size);
24
	byte changeSIZE(byte size);
5730 pavelyakov 25
};
26
FONT font = 0;
5736 pavelyakov 27
:byte FONT::changeSIZE(byte size)
5730 pavelyakov 28
{
5736 pavelyakov 29
	dword TMP_DATA;
30
	dword ofs;
31
	byte s;
32
	IF(size<9) size = 8;
33
	IF(size>45)size = 45;
34
		s = size-8;
35
		data = begin;
36
		TMP_DATA = data;
37
		TMP_DATA +=s*4;
38
		ofs = DSDWORD[TMP_DATA];
39
		IF(ofs==-1)return false;
40
		data += ofs;
41
		data += 156;
42
		TMP_DATA = data;
43
		file_size = DSDWORD[TMP_DATA];
44
		TMP_DATA += file_size;
45
		TMP_DATA--;
46
		height = DSBYTE[TMP_DATA];
47
		TMP_DATA--;
48
		width =  DSBYTE[TMP_DATA];
49
		block = math.ceil(height*width/32);
50
		return true;
51
}
52
:dword FONT::text(word x,y;dword text1,c;byte size)
53
{
5730 pavelyakov 54
	dword len=0;
5736 pavelyakov 55
	if(size)if(!changeSIZE(size))return 0;
56
 
5730 pavelyakov 57
	WHILE(DSBYTE[text1])
58
	{
59
		len += symbol(x+len,y,DSBYTE[text1],c);
60
		text1++;
61
	}
62
	return len;
63
}
5736 pavelyakov 64
:dword FONT::textarea(word x,y;dword text1,c;byte size)
5730 pavelyakov 65
{
66
	dword len=0;
5736 pavelyakov 67
	if(size)if(!changeSIZE(size))return 0;
5730 pavelyakov 68
	WHILE(DSBYTE[text1])
69
	{
70
		IF(DSBYTE[text1]=='\r'){ y+=height; len=0;}
71
		ELSE	len += symbol(x+len,y,DSBYTE[text1],c);
72
		text1++;
73
	}
74
	return len;
75
}
76
:byte FONT::symbol(signed x,y;byte s;dword c)
77
{
5736 pavelyakov 78
        dword xi,yi;
79
        dword tmp,_;
80
        dword iii;
81
        byte rw=0;
82
        IF(offsetLine)y+=offsetLine;
83
        IF(s==32)return width/4;
84
		IF(s==9)return width;
85
        yi = 0;
86
        iii = 0;
87
        tmp = 4*block*s;
88
        tmp +=data;
89
        while(yi
90
        {
91
                xi = 0;
92
                WHILE(xi
93
                {
94
                        IF(!(iii%32))
95
                        {
96
                                tmp += 4;
97
                                _ = DSDWORD[tmp];
98
                        }
99
                        ELSE _ >>= 1;
100
                        IF(_&1)
101
                        {
102
                                IF(xi>rw)rw=xi;
103
                                PutPixel(x+xi,y+yi,c);
104
                        }
105
                        xi++;
106
                        iii++;
107
                }
108
                yi++;
109
        }
110
        return rw;
5730 pavelyakov 111
}
112
:byte FONT::load(dword path)
113
{
114
	dword tmp;
115
	IF(data)free(data);
116
	tmp = io.read(path);
117
	data = tmp;
5736 pavelyakov 118
	begin = data;
5730 pavelyakov 119
	size_file = io.FILES_SIZE;
120
	tmp +=size_file;
121
	tmp--;
122
	height = DSBYTE[tmp];
123
	tmp--;
124
	width = DSBYTE[tmp];
125
	block = math.ceil(height*width/32);
126
}
127
 
128
#endif