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 |