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