0,0 → 1,95 |
; |
; Макрос для загрузки изображений чрез функции библиотеки libimg. |
; Действия которые делает макрос load_image_file: |
; |
; Проверяет размер полученного файла с изображением. |
; Выделяет под него память и загружает туда файл. |
; Определяет размер памяти необходимой для распаковки изображения. |
; Перевыделяет память, и распаковывает изображение из форматов jpg, png, ... |
; в формат rgb который можно выводить на экран через сист. функцию. |
; При необходимости можно также получить размеры открываемого изображения для |
; их дальнейшего использования в программе. |
; |
; В использующей программе должна быть подключена библиотека libimg, |
; объявлена переменная file_name размером около 4096 байт, |
; а также структура run_file_70 типа FileInfoBlock. |
|
; подключение некоторых необходимых файлов: |
include 'dll.inc' |
include 'develop/libraries/box_lib/load_lib.mac' |
include 'libio.inc' |
|
align 4 |
open_b rb 560 |
|
; path - может быть переменной или строковым параметром |
; buf - переменная куда будет записан указатель на изображение в формате rgb |
; img_w, img_h - переменные куда будут записаны размеры открываемого |
; изображения, не обязательные параметры |
; bytes_p_p - сколько байт памяти брать на пиксель, не обязательный параметр |
; если не указан берется 3. Минимальное значение должно быть не меньше 3. |
macro load_image_file path, buf, img_w, img_h, bytes_p_p |
{ |
local .end_open |
if path eqtype '' ;проверяем задан ли строкой параметр path |
local .path_str |
jmp @f |
.path_str db path ;формируем локальную переменную |
db 0 |
@@: |
;32 - стандартный адрес по которому должен быть буфер с системным путем |
copy_path .path_str,[32],file_name,0 |
else |
copy_path path,[32],file_name,0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой |
end if |
mov [run_file_70.Function], SSF_GET_INFO |
mov [run_file_70.Position], 0 |
mov [run_file_70.Flags], 0 |
mov dword[run_file_70.Count], 0 |
mov dword[run_file_70.Buffer], open_b |
mov byte[run_file_70+20], 0 |
mov dword[run_file_70.FileName], file_name |
mcall SF_FILE,run_file_70 |
or eax,eax |
jnz .end_open |
|
mov ecx,dword[open_b+32] ;+32 qword: размер файла в байтах |
stdcall mem.Alloc,ecx ;выделяем память для изображения |
mov [buf],eax |
mov [run_file_70.Function], SSF_READ_FILE |
mov [run_file_70.Position], 0 |
mov [run_file_70.Flags], 0 |
mov [run_file_70.Count], ecx |
mov [run_file_70.Buffer], eax |
mov byte[run_file_70+20], 0 |
mov [run_file_70.FileName], file_name |
mcall SF_FILE,run_file_70 ;загружаем файл изображения |
cmp ebx,0xffffffff |
je .end_open |
;определяем вид изображения и пишем его параметры |
stdcall [img_decode], [buf],ebx,0 |
mov ebx,eax |
;определяем размер декодированного изображения |
mov ecx,[eax+4] ;+4 = image width |
if img_w eq |
else |
mov dword[img_w],ecx |
end if |
if img_h eq |
imul ecx,[eax+8] ;+8 = image height |
else |
mov eax,[eax+8] ;+8 = image height |
mov dword[img_h],eax |
imul ecx,eax |
end if |
if bytes_p_p eq |
imul ecx,3 ;need for r,g,b |
else |
imul ecx,bytes_p_p |
end if |
stdcall mem.ReAlloc,[buf],ecx ;изменяем размер для буфера |
mov [buf],eax |
stdcall [img_to_rgb2], ebx,[buf] ;преобразуем изображение к формату rgb |
stdcall [img_destroy], ebx ;удаляем временный буфер с параметрами изображения |
.end_open: |
} |