Rev 5730 | 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 | { |
||
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 |