Subversion Repositories Kolibri OS

Rev

Rev 1167 | Go to most recent revision | Details | 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
;        mov     dword [save_point_nt],ebp
93
        cld     ;установка флага направления
94
align 4
95
.start_loop:
96
        push    ecx
97
        lea     edi,[ebp+0x28] ;в edi указатель на начало имени.
98
        xor     eax,eax
99
        mov     ecx,263
100
align 4
101
.again: mov     al,byte[edi]
102
        test    al,al
103
        jz      .next_a
104
        dec     ecx
105
        inc     edi
106
        jnz     .again
107
        jmp     @f
108
;        repe    scasb   ;найдем конец строки
109
;        jnz     @f
110
;;;; имя присутствует, проверим являтся ли имя файла с расширением fnt )
111
;        sub     edi,6   ;.ksf,0
112
;;;;;;;;;;;;;;;;;;;;;;;
113
.next_a:
114
        sub     edi,4   ;.ksf,0
115
        mov     esi,dword name_font
116
        mov     ecx,name_font_e-name_font
117
        repe    cmpsb
118
        jnz     @f
119
;;;;;;;; ура это наш файл т.е. наш шрифт мы нашли нужный файлик ))
120
;теперь нужно точно убедиться что это наш и только наш файлик
121
;загрузим заголовок файла и узнаем его размер глифа.
122
        call    alloc_mem       ; выделим озу своих переменных
123
; сейчас нам нужно сформировать имя файла с полным путем
124
        mov     eax,dword [alloc_memory_point]
125
        lea     edi,dword [eax+4]
126
        lea     esi,[name_fulder]
127
        mov     ecx,name_fuld_end
128
        rep     movsb   ;переносим путь
129
        mov     al,'/'
130
        stosb
131
        lea     esi,[ebp+0x28] ;в esi указатель на начало имени.
132
align 4
133
.loop_b:
134
        lodsb
135
        stosb
136
        test    al,al
137
        jnz     .loop_b
138
 
139
;        mov     edi,name_of_file ; [ebp+0x28] ;в edi указатель на начало имени.
140
;get in buffer info above own file
141
        xor     eax,eax
142
        mov     dword [number_function],eax
143
        mov     dword [index_start_block],eax   ;позиция в файле для чтения данных
144
        mov     dword [flags_],eax              ;старшая позиция для чтения данных
145
        mov     dword [read_block],8            ;сколько байт читать нам нужно 8 байт
146
        mov     dword [buffer_read_d],file_buffer ; указатель на буфер куда будут записаны данные
147
 
148
        mov     eax,dword [alloc_memory_point]
149
        lea     edi,dword [eax+4]
150
        mov     dword [offset_to_string],edi
151
 
152
        mov     eax,70
153
        mov     ebx,dword struct_f_info
154
        mcall
155
;;;;;;;;;;;;;;;; проверим формат заголовка
156
        mov     eax,ebx
157
        mov     eax,dword [file_buffer]
158
        mov     ebx,dword [type_fnt]
159
        cmp     eax,ebx
160
        jnz     @f
161
 
162
;;;;;;; отлично сейчас проверили что заголовок именно тот который нам нужен
163
; сейчас нужно перераспределить блоки т.е. по мере нахождения будем переносить блоки
164
; в начало буфера
165
 
166
        mov     dword [save_point_nt],ebp
167
;        mov     esi, ebp
168
;        mov     ecx,304/4
169
 
170
 
171
 
172
;align 4
173
;.transfer:
174
;        lodsd
175
;        stosd
176
;        loop .transfer
177
;        add     dword [save_point_nt],304       ;указатель на следующий блок
178
;;; сделали тарнсфер перемещение данных
179
        pop     ecx
180
        mov     dword [esp+28],0
181
        popad
182
        ret
183
 
184
 
185
align 4
186
@@:     pop     ecx
187
        add     ebp,304
188
        dec     ecx
189
        jnz     .start_loop
190
;        loop    .start_loop
191
;        xor     eax,eax
192
;;;;;;;; прошлись - все интересущющие шрифты переместили в начало блока.
193
 
194
align 4
195
.exit:  mov     dword [esp+28],eax
196
popad
197
ret
198
 
199
 
200
align 4
201
get_font:
202
; поиск в массиве шрифта при совпадении уcловий загрузка шрифта
203
; esp+4 = dd width font shl 16 +hight font
204
; esp+0 = dd back
205
pop     eax
206
        pop     dword [font_x_y]
207
push    eax
208
;       pop     eax
209
;       mov     dword [font_x_y],eax
210
pushad
211
 
212
 
213
 
214
        xor     eax,eax
215
        mov     dword [number_function],eax
216
        mov     dword [index_start_block],eax   ;позиция в файле для чтения данных
217
        mov     dword [flags_],eax              ;старшая позиция для чтения данных
218
        mov     dword [read_block],8            ;сколько байт читать нам нужно 8 байт
219
        mov     dword [buffer_read_d],file_buffer ; указатель на буфер куда будут записаны данные
220
 
221
        mov     eax,dword [alloc_memory_point]
222
        lea     edi,dword [eax+4]
223
        mov     dword [offset_to_string],edi
224
 
225
 
226
;        mov     ecx,dword [save_ecx]            ; кол-во итераций т.е. проходов
227
align 4
228
;.start_check:
229
;        push    ecx
230
        mov     eax,70
231
        mov     ebx,dword struct_f_info
232
        mcall
233
;;;;;;;;;;;;;;;; проверим формат заголовка
234
        mov     eax,ebx
235
        mov     eax,dword [file_buffer]
236
        mov     ebx,dword [type_fnt]
237
        cmp     eax,ebx
238
;        jnz     @f
239
 
240
 
241
;        xor     eax,eax
242
;        mov     dword [number_function],eax
243
;        add     eax,8
244
;        mov     dword [read_block],eax
245
;        mov     dword [buffer_read_d],file_buffer
246
;        mov     ebx,dword struct_f_info
247
;        mov     eax,70
248
;align 4
249
;.start_check:
250
;загрузим заголовок файла и узнаем его размер глифа.
251
;        lea     edi, [ebp+0x28] ;в edi указатель на начало имени.
252
;        mov     dword [offset_to_string],edi
253
;get in buffer info above own file
254
;        mcall
255
;;;;;;;;;;;;;;;; проверим формат заголовка
256
;        mov     ecx,dword [file_buffer.type_fnt]
257
;        mov     edx,dword [type_fnt]
258
;        cmp     ecx,edx
259
;        jnz     @f
260
 
261
        mov     ecx,dword [file_buffer.font_size]
262
        mov     edx,dword [font_x_y]
263
        cmp     ecx,edx
264
;        jnz     @f      ;упс неудача вышла
265
;шрифт совпал т.е. это наш,нужный нам шрифт, мы его должны загрузить в ОЗУ
266
 
267
;        mov     ebp,dword [save_point_nt]
268
        mov     ecx, 4096;dword [ebp+32]     ;размер файла до 4294967296 байт т.е. 4 Гб
269
 
270
        mov     dword [read_block],ecx
271
        mov     eax,68
272
        mov     ebx,12
273
        mcall
274
 
275
        mov     dword [font_array_point],eax    ;save point to array
276
        mov     dword [buffer_read_d],eax
277
 
278
;load font
279
        mov     ebx,dword struct_f_info
280
        mov     eax,70
281
        mcall
282
        test    eax,eax
283
        jnz     @f
284
 
285
        lea     eax,[buffer_read_d]
286
        mov     eax,dword [eax]
287
        mov     ebx,dword [eax+8]
288
        add     eax,ebx
289
;        add     eax,dword [eax+8]
290
;        add     eax,dword [buffer_read_d]
291
        mov     dword [font_array_data],eax
292
        mov     dword [esp+28],0
293
;        pop     ecx
294
popad
295
ret
296
 
297
 
298
 
299
 
300
;here error file system
301
align 4
302
@@:
303
;        pop     ecx
304
;        add     ebp,304
305
;        dec     ecx
306
 ;       jnz      .start_check
307
 
308
        or      dword [esp+28],-1       ;вернем ошибку
309
        popad
310
        ret
311
 
312
 
313
; поиск вывод сторочки по символьно сфорированного шрифтом текста
314
; esp+12= dd x shl 16 + y x- координата по Х, y - координата по Y
315
; esp+8 = dd point to color of background and font
316
; esp+4 = dd point to ASCIIZ
317
; esp+0 = dd back
318
align 4
319
font_draw_on_string:
320
pushad
321
 
322
        mov     esi,dword [esp+4+32] ;ASCIIZ
323
        mov     edx,dword [esp+12+32]  ; x shl 16 +y
324
        mov     ecx,dword [font_x_y]  ;размер глифа x shl 16 +y
325
        mov     edi,dword [esp+8+32]     ;указатель на палитру из цвета и фона
326
        xor     ebp,ebp         ;см 65 функцию ))
327
 
328
        ;;;;;;;;;;;;;;;;;;;;;
329
;        pushad
330
;        mov     ebp, dword [esp+4+32+32]
331
;         mov     ebp, dword [save_point_nt]
332
;        lea     edi, [ebp+0x28] ;в edi указатель на начало имени.
333
;        sub     edi,4   ;.ksf,0
334
;        mov eax,4
335
;        mov ebx,dword [show_dir]
336
;        add     dword [show_dir],10
337
;        mov ecx,0x80000000;DDBBCC
338
;        mov edx,ebp;[ebp+0x28];eax;edi
339
;        xor     esi,esi
340
      ;mov esi,8
341
;        mcall
342
;        popad
343
;;;;;;;;;;;;;;;;;;;;;;;;
344
 
345
        cld
346
align 4
347
@@:     ;pushad
348
        xor     eax,eax
349
        lodsb
350
        test    al,al
351
        jz      .exit
352
;        movzx   eax,al
353
        shl     eax,4         ;умножаем на 16 т.к. это высота глифа
354
;        imul    eax,16
355
 
356
        mov     ebx,dword [font_array_data]    ; тут распологаются глифы символов
357
;        add     eax,ebx
358
;        mov     ebx,dword [ebx+8] ; смещение
359
;        add     eax,ebx
360
        add     ebx,eax
361
        push    esi
362
        mov     esi,1
363
        mov     eax,65
364
        mcall
365
        pop     esi
366
        add     edx,8 shl 16    ;следующий символ ширина символа = 8 точкам
367
        jmp     @b
368
align 4
369
.exit:  ;popad
370
 
371
;        add     edx,16
372
;        loop    .next
373
 
374
align 4
375
.return:
376
popad
377
ret 12
378
 
379
 
380
align 4
381
; esp+4 = dd point to color of background and font
382
show_all_glif:
383
pushad
384
 
385
        mov     edx,10 shl 16+20 ;dword [esp+12+32]  ; x shl 16 +y
386
        mov     ecx,128 shl 16 +256;dword [font_x_y]  ;размер глифа x shl 16 +y
387
        mov     edi,dword [esp+4+32]     ;указатель на палитру из цвета и фона
388
        xor     ebp,ebp         ;см 65 функцию ))
389
 
390
align 4
391
@@:
392
        mov     ebx,dword [font_array_data]    ; тут распологаются глифы символов
393
        mov     esi,1
394
        mov     eax,65
395
        mcall
396
 
397
popad
398
ret 4
399
 
400
 
401
 
402
 
403
 
404
 
405
align 4
406
free_fulder_info:
407
;освободить память выделеную для получения блоков БДВК
408
pushad
409
        mov     ecx, dword [fulder_array_point]
410
        mov     eax,68
411
        mov     ebx,13
412
        mcall
413
        test    eax,eax
414
        jnz     @f
415
        or      dword [esp+28],-1       ;вернем ошибку
416
align 4
417
@@:
418
popad
419
        ret
420
align 4
421
free_font:
422
;освободить память выделеную для получения блоков БДВК
423
pushad
424
        mov     ecx, dword [font_array_point]
425
        mov     eax,68
426
        mov     ebx,13
427
        mcall
428
        test    eax,eax
429
        jnz     @f
430
        or      dword [esp+28],-1       ;вернем ошибку
431
align 4
432
@@:
433
popad
434
        ret
435
 
436
align 4
437
; alloc mem get 4 Kb for own data
438
alloc_mem:
439
        pushad
440
        mov     eax, dword [alloc_memory_point]
441
        test    eax,eax
442
        jnz     .mem_allocating
443
        mov     eax,68
444
        mov     ebx,12
445
        mov     ecx,4096
446
        mcall
447
        mov     dword [alloc_memory_point],eax  ; при первом вхождении выделяем 4 кб ОЗУ и сохраняем указатель
448
        mov     dword [eax],-1
449
        popad
450
        ret
451
align 4
452
.mem_allocating:
453
        mov     ebp, dword [eax]
454
        mov     eax,ebp
455
        cmp     eax, -1
456
        jnz     .mem_allocating
457
 
458
        mov     eax,68
459
        mov     ebx,12
460
        mov     ecx,4096
461
        mcall
462
        mov     dword [ebp],eax ; при первом вхождении выделяем 4 кб ОЗУ и сохраняем указатель
463
        mov     dword [ebp],-1
464
        popad
465
        ret
466
 
467
align 16
468
EXPORTS:
469
 
470
        dd      sz_initialization_font, initialization_font
471
        dd      sz_get_font,            get_font
472
        dd      sz_free_fulder_info,    free_fulder_info
473
        dd      sz_free_font,           free_font
474
        dd      sz_font_draw_on_string, font_draw_on_string
475
        dd      sz_show_all_glif,       show_all_glif
476
;        dd      szVersion_ch,           0x00000001
477
;        dd      sz_option_box_draw,     option_box_draw
478
;        dd      sz_option_box_mouse,    option_box_mouse
479
        dd      szVersion_fn,           0x00000001
480
        dd      0,0
481
 
482
sz_initialization_font db 'initialization_font',0
483
sz_get_font            db 'get_font',0
484
sz_free_fulder_info    db 'free_fulder_info',0
485
sz_free_font           db 'free_font',0
486
sz_font_draw_on_string db 'font_draw_on_string',0
487
sz_show_all_glif       db 'show_all_glif',0
488
;sz_check_box_mouse     db 'check_box_mouse',0
489
;szVersion_ch           db 'version_ch',0
490
;sz_option_box_draw     db 'option_box_draw',0
491
;sz_option_box_mouse    db 'option_box_mouse',0
492
szVersion_fn           db 'version_fn',0
493
 
494
;;;;;;;;;;;
495
;;Data
496
;;;;;;;;;;;
497
align 4
498
;buffer_font file 'font_8x16.fon' ;шрифт которым будем выводить raw формат 1bpp
499
save_ecx        dd      0x0
500
;buffer_font file 'font01.ksf' ;шрифт которым будем выводить raw формат 1bpp
501
alloc_memory_point      dd      0x0     ; point to mem block in RAM 4096-4
502
;структура такая в начале выделеного блока размещается указатель на другой выделлный блок в 4096-4, если это блок последний, то dd -1
503
font_x_y          dd 0x0
504
fulder_array_point dd 0x0
505
font_array_point  dd 0x0
506
font_array_data   dd 0x0        ; реальные данные т.е. матрица шрифта
507
save_ebp          dd 0x0
508
save_point_nt     dd 0x0
509
;name_of_file     db 263 dup(0x0)
510
;name_of_file      db '/sys/FONTS/font01.ksf',0
511
name_fulder       db '/sys/FONTS',0
512
name_fuld_end=     ($-name_fulder) -1
513
name_font         db '.ksf'
514
name_font_e:
515
type_fnt          db 'kf01'
516
type_fnt_e:
517
 
518
 
519
 
520
align 16
521
struct_f_info:
522
number_function   dd 0x0
523
index_start_block dd 0x0
524
flags_            dd 0x0
525
read_block        dd 0x0
526
buffer_read_d     dd buffer_32
527
free_byte         db 0x0
528
offset_to_string  dd name_fulder
529
 
530
align 16
531
file_buffer:
532
.type_fnt       dd 0x0
533
.font_size      dd 0x0
534
 
535
align 16
536
buffer_32:
537
.head             dd ?
538
.quantity_block   dd ?
539
.quantity_files   dd ?
540
                  rb 20