forked from KolibriOS/kolibrios
96 lines
4.5 KiB
PHP
96 lines
4.5 KiB
PHP
|
;
|
|||
|
; Макрос для загрузки изображений чрез функции библиотеки 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:
|
|||
|
}
|