Rev 6211 | Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
6200 | IgorA | 1 | ; |
2 | ; Макрос для загрузки изображений чрез функции библиотеки libimg. |
||
3 | ; Действия которые делает макрос load_image_file: |
||
4 | ; |
||
5 | ; Проверяет размер полученного файла с изображением. |
||
6 | ; Выделяет под него память и загружает туда файл. |
||
7 | ; Определяет размер памяти необходимой для распаковки изображения. |
||
8 | ; Перевыделяет память, и распаковывает изображение из форматов jpg, png, ... |
||
9 | ; в формат rgb который можно выводить на экран через сист. функцию. |
||
10 | ; При необходимости можно также получить размеры открываемого изображения для |
||
11 | ; их дальнейшего использования в программе. |
||
12 | ; |
||
13 | ; В использующей программе должна быть подключена библиотека libimg, |
||
14 | ; объявлена переменная file_name размером около 4096 байт, |
||
15 | ; а также структура run_file_70 типа FileInfoBlock. |
||
16 | |||
17 | ; подключение некоторых необходимых файлов: |
||
18 | include 'dll.inc' |
||
19 | include 'develop/libraries/box_lib/load_lib.mac' |
||
20 | include 'libio.inc' |
||
21 | |||
22 | align 4 |
||
23 | open_b rb 560 |
||
24 | |||
25 | ; path - может быть переменной или строковым параметром |
||
26 | ; buf - переменная куда будет записан указатель на изображение в формате rgb |
||
27 | ; img_w, img_h - переменные куда будут записаны размеры открываемого |
||
28 | ; изображения, не обязательные параметры |
||
29 | ; bytes_p_p - сколько байт памяти брать на пиксель, не обязательный параметр |
||
30 | ; если не указан берется 3. Минимальное значение должно быть не меньше 3. |
||
31 | macro load_image_file path, buf, img_w, img_h, bytes_p_p |
||
32 | { |
||
33 | local .end_open |
||
34 | if path eqtype '' ;проверяем задан ли строкой параметр path |
||
35 | local .path_str |
||
36 | jmp @f |
||
37 | .path_str db path ;формируем локальную переменную |
||
38 | db 0 |
||
39 | @@: |
||
40 | ;32 - стандартный адрес по которому должен быть буфер с системным путем |
||
41 | copy_path .path_str,[32],file_name,0 |
||
42 | else |
||
43 | copy_path path,[32],file_name,0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой |
||
44 | end if |
||
45 | mov [run_file_70.Function], SSF_GET_INFO |
||
46 | mov [run_file_70.Position], 0 |
||
47 | mov [run_file_70.Flags], 0 |
||
48 | mov dword[run_file_70.Count], 0 |
||
49 | mov dword[run_file_70.Buffer], open_b |
||
50 | mov byte[run_file_70+20], 0 |
||
51 | mov dword[run_file_70.FileName], file_name |
||
52 | mcall SF_FILE,run_file_70 |
||
53 | or eax,eax |
||
54 | jnz .end_open |
||
55 | |||
56 | mov ecx,dword[open_b+32] ;+32 qword: размер файла в байтах |
||
57 | stdcall mem.Alloc,ecx ;выделяем память для изображения |
||
58 | mov [buf],eax |
||
59 | mov [run_file_70.Function], SSF_READ_FILE |
||
60 | mov [run_file_70.Position], 0 |
||
61 | mov [run_file_70.Flags], 0 |
||
62 | mov [run_file_70.Count], ecx |
||
63 | mov [run_file_70.Buffer], eax |
||
64 | mov byte[run_file_70+20], 0 |
||
65 | mov [run_file_70.FileName], file_name |
||
66 | mcall SF_FILE,run_file_70 ;загружаем файл изображения |
||
67 | cmp ebx,0xffffffff |
||
68 | je .end_open |
||
69 | ;определяем вид изображения и пишем его параметры |
||
70 | stdcall [img_decode], [buf],ebx,0 |
||
71 | mov ebx,eax |
||
72 | ;определяем размер декодированного изображения |
||
73 | mov ecx,[eax+4] ;+4 = image width |
||
74 | if img_w eq |
||
75 | else |
||
76 | mov dword[img_w],ecx |
||
77 | end if |
||
78 | if img_h eq |
||
79 | imul ecx,[eax+8] ;+8 = image height |
||
80 | else |
||
81 | mov eax,[eax+8] ;+8 = image height |
||
82 | mov dword[img_h],eax |
||
83 | imul ecx,eax |
||
84 | end if |
||
85 | if bytes_p_p eq |
||
86 | imul ecx,3 ;need for r,g,b |
||
87 | else |
||
88 | imul ecx,bytes_p_p |
||
89 | end if |
||
90 | stdcall mem.ReAlloc,[buf],ecx ;изменяем размер для буфера |
||
91 | mov [buf],eax |
||
92 | stdcall [img_to_rgb2], ebx,[buf] ;преобразуем изображение к формату rgb |
||
93 | stdcall [img_destroy], ebx ;удаляем временный буфер с параметрами изображения |
||
94 | .end_open: |
||
95 | } |