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