Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1158 Lrz 1
; Copyright (c) 2009, 
2
; All rights reserved.
3
;
4
; Redistribution and use in source and binary forms, with or without
5
; modification, are permitted provided that the following conditions are met:
6
;       * Redistributions of source code must retain the above copyright
7
;       notice, this list of conditions and the following disclaimer.
8
;       * Redistributions in binary form must reproduce the above copyright
9
;       notice, this list of conditions and the following disclaimer in the
10
;       documentation and/or other materials provided with the distribution.
11
;       * Neither the name of the  nor the
12
;       names of its contributors may be used to endorse or promote products
13
;       derived from this software without specific prior written permission.
14
;
15
; THIS SOFTWARE IS PROVIDED BY Alexey Teplov nickname  ''AS IS'' AND ANY
16
; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17
; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18
; DISCLAIMED. IN NO EVENT SHALL  BE LIABLE FOR ANY
19
; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20
; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21
; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22
; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23
; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24
; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
;*****************************************************************************
26
 
27
;Fonts library
28
;
29
;;;;;;;;;;;;;;;;;;
30
 
31
format MS COFF
32
 
33
public EXPORTS
34
 
35
section '.flat' code readable align 16
36
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
37
;Get info about
38
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
39
include '../../../../macros.inc'
40
align 4
41
initialization_font:
42
; esp+0 = dd back
43
; заполняем массив - структу для получения кол-ва файлов
44
 
45
pushad
46
        xor     eax,eax
47
        inc     eax
48
        mov     [number_function],eax
49
;structure is completed
50
        mov     eax,70
51
        mov     ebx,dword struct_f_info
52
        mcall
53
;IF ERROR FT then exit
54
        test    eax,eax
55
        jnz     .exit
56
;IF ERROR folder is not found then exit
57
        test    ebx,ebx
58
        mov     eax,ebx
59
        jnz     .exit
60
 
61
;Get quantity files
62
        mov     eax,[buffer_32.quantity_files]
63
        imul    eax,304
64
        add     eax,32          ; ??
65
        push    eax         ;save eax в eax размер нужной нам памяти в байтах
66
;init memory
67
        mov     eax,68
68
        mov     ebx,11
69
        mcall
70
        test    eax,eax
71
        jz     .exit
72
        inc     ebx     ;выделить блок в ecx байт
73
 
74
        pop     ecx
75
        mov     eax,68
76
        mcall
77
        mov     dword [fulder_array_point],eax  ;save point for memory's fulder
78
;в eax указатель на блок
79
        mov     [buffer_read_d],eax             ;point to new array
80
        mov     eax,[buffer_32.quantity_files]
81
        mov     [read_block],eax
82
;get in buffer info of files and sub dir current dir
83
        mov     eax,70
84
        mov     ebx,dword struct_f_info
85
        mcall
86
;получили информацию о файлах.
87
        mov     ebp, dword [buffer_read_d] ;point to structure
88
        mov     ecx, dword [ebp+4]         ;кол-во блоков БДВК
89
        mov     dword [save_ecx],ecx
90
        add     ebp, 32 ;смещаемся до БДВК
91
        mov     dword [save_ebp],ebp
92
        cld     ;установка флага направления
93
align 4
94
.start_loop:
95
        push    ecx
96
        lea     edi,[ebp+0x28] ;в edi указатель на начало имени.
97
        xor     eax,eax
98
        mov     ecx,263
1167 Lrz 99
        repne    scasb   ;найдем конец строки
1158 Lrz 100
;;;;;;;;;;;;;;;;;;;;;;;
101
.next_a:
1167 Lrz 102
        sub     edi,5   ;.ksf,0
1158 Lrz 103
        mov     esi,dword name_font
104
        mov     ecx,name_font_e-name_font
105
        repe    cmpsb
106
        jnz     @f
107
;;;;;;;; ура это наш файл т.е. наш шрифт мы нашли нужный файлик ))
108
;теперь нужно точно убедиться что это наш и только наш файлик
109
;загрузим заголовок файла и узнаем его размер глифа.
110
        call    alloc_mem       ; выделим озу своих переменных
111
; сейчас нам нужно сформировать имя файла с полным путем
112
        mov     eax,dword [alloc_memory_point]
113
        lea     edi,dword [eax+4]
114
        lea     esi,[name_fulder]
115
        mov     ecx,name_fuld_end
116
        rep     movsb   ;переносим путь
117
        mov     al,'/'
118
        stosb
119
        lea     esi,[ebp+0x28] ;в esi указатель на начало имени.
120
align 4
121
.loop_b:
122
        lodsb
123
        stosb
124
        test    al,al
125
        jnz     .loop_b
126
 
127
;        mov     edi,name_of_file ; [ebp+0x28] ;в edi указатель на начало имени.
128
;get in buffer info above own file
129
        xor     eax,eax
130
        mov     dword [number_function],eax
131
        mov     dword [index_start_block],eax   ;позиция в файле для чтения данных
132
        mov     dword [flags_],eax              ;старшая позиция для чтения данных
133
        mov     dword [read_block],8            ;сколько байт читать нам нужно 8 байт
134
        mov     dword [buffer_read_d],file_buffer ; указатель на буфер куда будут записаны данные
135
 
136
        mov     eax,dword [alloc_memory_point]
137
        lea     edi,dword [eax+4]
138
        mov     dword [offset_to_string],edi
139
 
140
        mov     eax,70
141
        mov     ebx,dword struct_f_info
142
        mcall
143
;;;;;;;;;;;;;;;; проверим формат заголовка
144
        mov     eax,ebx
145
        mov     eax,dword [file_buffer]
146
        mov     ebx,dword [type_fnt]
147
        cmp     eax,ebx
148
        jnz     @f
149
 
150
;;;;;;; отлично сейчас проверили что заголовок именно тот который нам нужен
151
; сейчас нужно перераспределить блоки т.е. по мере нахождения будем переносить блоки
152
; в начало буфера
153
 
154
        mov     dword [save_point_nt],ebp
155
        pop     ecx
156
        mov     dword [esp+28],0
157
        popad
158
        ret
159
 
160
 
161
align 4
162
@@:     pop     ecx
163
        add     ebp,304
164
        dec     ecx
165
        jnz     .start_loop
166
;        loop    .start_loop
167
;        xor     eax,eax
168
;;;;;;;; прошлись - все интересущющие шрифты переместили в начало блока.
169
 
170
align 4
171
.exit:  mov     dword [esp+28],eax
172
popad
173
ret
174
 
175
 
176
align 4
177
get_font:
178
; поиск в массиве шрифта при совпадении уcловий загрузка шрифта
179
; esp+4 = dd width font shl 16 +hight font
180
; esp+0 = dd back
1167 Lrz 181
;pop     eax
182
;        pop     dword [font_x_y]
183
;push    eax
1158 Lrz 184
pushad
1167 Lrz 185
        mov     eax,dword [esp+32+4]
186
        mov     dword [font_x_y],eax
1158 Lrz 187
        xor     eax,eax
188
        mov     dword [number_function],eax
189
        mov     dword [index_start_block],eax   ;позиция в файле для чтения данных
190
        mov     dword [flags_],eax              ;старшая позиция для чтения данных
191
        mov     dword [read_block],8            ;сколько байт читать нам нужно 8 байт
192
        mov     dword [buffer_read_d],file_buffer ; указатель на буфер куда будут записаны данные
193
 
194
        mov     eax,dword [alloc_memory_point]
195
        lea     edi,dword [eax+4]
196
        mov     dword [offset_to_string],edi
197
 
198
 
199
        mov     eax,70
200
        mov     ebx,dword struct_f_info
201
        mcall
202
;;;;;;;;;;;;;;;; проверим формат заголовка
203
        mov     eax,ebx
204
        mov     eax,dword [file_buffer]
205
        mov     ebx,dword [type_fnt]
206
        cmp     eax,ebx
207
 
208
        mov     ecx,dword [file_buffer.font_size]
209
        mov     edx,dword [font_x_y]
210
        cmp     ecx,edx
211
 
212
        mov     ecx, 4096;dword [ebp+32]     ;размер файла до 4294967296 байт т.е. 4 Гб
213
 
214
        mov     dword [read_block],ecx
215
        mov     eax,68
216
        mov     ebx,12
217
        mcall
218
 
219
        mov     dword [font_array_point],eax    ;save point to array
220
        mov     dword [buffer_read_d],eax
221
 
222
;load font
223
        mov     ebx,dword struct_f_info
224
        mov     eax,70
225
        mcall
226
        test    eax,eax
227
        jnz     @f
228
 
229
        lea     eax,[buffer_read_d]
230
        mov     eax,dword [eax]
231
        mov     ebx,dword [eax+8]
232
        add     eax,ebx
233
;        add     eax,dword [eax+8]
234
;        add     eax,dword [buffer_read_d]
235
        mov     dword [font_array_data],eax
236
        mov     dword [esp+28],0
237
;        pop     ecx
238
popad
1167 Lrz 239
ret 4
1158 Lrz 240
 
241
;here error file system
242
align 4
243
@@:
244
        or      dword [esp+28],-1       ;вернем ошибку
245
        popad
1167 Lrz 246
        ret 4
1158 Lrz 247
 
248
 
249
; поиск вывод сторочки по символьно сфорированного шрифтом текста
250
; esp+12= dd x shl 16 + y x- координата по Х, y - координата по Y
251
; esp+8 = dd point to color of background and font
252
; esp+4 = dd point to ASCIIZ
253
; esp+0 = dd back
254
align 4
255
font_draw_on_string:
256
pushad
257
 
258
        mov     esi,dword [esp+4+32] ;ASCIIZ
259
        mov     edx,dword [esp+12+32]  ; x shl 16 +y
260
        mov     ecx,dword [font_x_y]  ;размер глифа x shl 16 +y
261
        mov     edi,dword [esp+8+32]     ;указатель на палитру из цвета и фона
262
        xor     ebp,ebp         ;см 65 функцию ))
263
        cld
264
align 4
265
@@:     ;pushad
266
        xor     eax,eax
267
        lodsb
268
        test    al,al
1167 Lrz 269
        jz      .return
1158 Lrz 270
        shl     eax,4         ;умножаем на 16 т.к. это высота глифа
271
 
272
        mov     ebx,dword [font_array_data]    ; тут распологаются глифы символов
273
        add     ebx,eax
274
        push    esi
275
        mov     esi,1
276
        mov     eax,65
277
        mcall
278
        pop     esi
279
        add     edx,8 shl 16    ;следующий символ ширина символа = 8 точкам
280
        jmp     @b
281
 
282
align 4
283
.return:
284
popad
285
ret 12
286
 
287
 
288
align 4
289
; esp+4 = dd point to color of background and font
290
show_all_glif:
291
pushad
292
 
293
        mov     edx,10 shl 16+20 ;dword [esp+12+32]  ; x shl 16 +y
294
        mov     ecx,128 shl 16 +256;dword [font_x_y]  ;размер глифа x shl 16 +y
295
        mov     edi,dword [esp+4+32]     ;указатель на палитру из цвета и фона
296
        xor     ebp,ebp         ;см 65 функцию ))
297
 
298
align 4
299
@@:
300
        mov     ebx,dword [font_array_data]    ; тут распологаются глифы символов
301
        mov     esi,1
302
        mov     eax,65
303
        mcall
304
popad
305
ret 4
306
 
307
 
308
 
309
 
310
 
311
 
312
align 4
313
free_fulder_info:
314
;освободить память выделеную для получения блоков БДВК
315
pushad
316
        mov     ecx, dword [fulder_array_point]
317
        mov     eax,68
318
        mov     ebx,13
319
        mcall
320
        test    eax,eax
321
        jnz     @f
322
        or      dword [esp+28],-1       ;вернем ошибку
323
align 4
324
@@:
325
popad
326
        ret
327
align 4
328
free_font:
329
;освободить память выделеную для получения блоков БДВК
330
pushad
331
        mov     ecx, dword [font_array_point]
332
        mov     eax,68
333
        mov     ebx,13
334
        mcall
335
        test    eax,eax
336
        jnz     @f
337
        or      dword [esp+28],-1       ;вернем ошибку
338
align 4
339
@@:
340
popad
341
        ret
342
 
343
align 4
344
; alloc mem get 4 Kb for own data
345
alloc_mem:
346
        pushad
347
        mov     eax, dword [alloc_memory_point]
348
        test    eax,eax
349
        jnz     .mem_allocating
350
        mov     eax,68
351
        mov     ebx,12
352
        mov     ecx,4096
353
        mcall
354
        mov     dword [alloc_memory_point],eax  ; при первом вхождении выделяем 4 кб ОЗУ и сохраняем указатель
355
        mov     dword [eax],-1
356
        popad
357
        ret
358
align 4
359
.mem_allocating:
360
        mov     ebp, dword [eax]
361
        mov     eax,ebp
362
        cmp     eax, -1
363
        jnz     .mem_allocating
364
 
365
        mov     eax,68
366
        mov     ebx,12
367
        mov     ecx,4096
368
        mcall
369
        mov     dword [ebp],eax ; при первом вхождении выделяем 4 кб ОЗУ и сохраняем указатель
370
        mov     dword [ebp],-1
371
        popad
372
        ret
373
 
374
align 16
375
EXPORTS:
376
 
377
        dd      sz_initialization_font, initialization_font
378
        dd      sz_get_font,            get_font
379
        dd      sz_free_fulder_info,    free_fulder_info
380
        dd      sz_free_font,           free_font
381
        dd      sz_font_draw_on_string, font_draw_on_string
382
        dd      sz_show_all_glif,       show_all_glif
383
;        dd      szVersion_ch,           0x00000001
384
;        dd      sz_option_box_draw,     option_box_draw
385
;        dd      sz_option_box_mouse,    option_box_mouse
386
        dd      szVersion_fn,           0x00000001
387
        dd      0,0
388
 
389
sz_initialization_font db 'initialization_font',0
390
sz_get_font            db 'get_font',0
391
sz_free_fulder_info    db 'free_fulder_info',0
392
sz_free_font           db 'free_font',0
393
sz_font_draw_on_string db 'font_draw_on_string',0
394
sz_show_all_glif       db 'show_all_glif',0
395
;sz_check_box_mouse     db 'check_box_mouse',0
396
;szVersion_ch           db 'version_ch',0
397
;sz_option_box_draw     db 'option_box_draw',0
398
;sz_option_box_mouse    db 'option_box_mouse',0
399
szVersion_fn           db 'version_fn',0
400
 
401
;;;;;;;;;;;
402
;;Data
403
;;;;;;;;;;;
404
align 4
405
;buffer_font file 'font_8x16.fon' ;шрифт которым будем выводить raw формат 1bpp
406
save_ecx        dd      0x0
407
;buffer_font file 'font01.ksf' ;шрифт которым будем выводить raw формат 1bpp
408
alloc_memory_point      dd      0x0     ; point to mem block in RAM 4096-4
409
;структура такая в начале выделеного блока размещается указатель на другой выделлный блок в 4096-4, если это блок последний, то dd -1
410
font_x_y          dd 0x0
411
fulder_array_point dd 0x0
412
font_array_point  dd 0x0
413
font_array_data   dd 0x0        ; реальные данные т.е. матрица шрифта
414
save_ebp          dd 0x0
415
save_point_nt     dd 0x0
416
name_fulder       db '/sys/FONTS',0
417
name_fuld_end=     ($-name_fulder) -1
418
name_font         db '.ksf'
419
name_font_e:
420
type_fnt          db 'kf01'
421
type_fnt_e:
422
 
423
 
424
 
425
align 16
426
struct_f_info:
427
number_function   dd 0x0
428
index_start_block dd 0x0
429
flags_            dd 0x0
430
read_block        dd 0x0
431
buffer_read_d     dd buffer_32
432
free_byte         db 0x0
433
offset_to_string  dd name_fulder
434
 
435
align 16
436
file_buffer:
437
.type_fnt       dd 0x0
438
.font_size      dd 0x0
439
 
440
align 16
441
buffer_32:
442
.head             dd ?
443
.quantity_block   dd ?
444
.quantity_files   dd ?
445
                  rb 20