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