kolibrios-fun/programs/media/animage/trunk/load_from_parameters.inc

65 lines
2.3 KiB
PHP
Raw Normal View History

; load picture from file to memory
align 4
open_b rb 560
txt_not_memory db 'Cannot open image. Because there is not enough available memory.',0
align 4
load_picture:
mov [file_information.Function], SSF_GET_INFO
mov [file_information.Position], 0
mov [file_information.Flags], 0
mov dword[file_information.Count], 0
mov dword[file_information.Buffer], open_b
mov byte[file_information+20], 0
mov dword[file_information.FileName], file_path
mcall SF_FILE,file_information
or eax,eax
jnz .end_open
mov ecx,dword[open_b+32] ;+32 qword: размер файла в байтах
add ecx,mem_screen+mem_panel_all+mem_flood_f
mcall SF_SYS_MISC,SSF_MEM_REALLOC,,[ScreenPointer]
mov [ScreenPointer],eax
add eax,mem_screen+mem_panel_all
sub ecx,mem_screen+mem_panel_all+mem_flood_f
mov [file_information.Function], SSF_READ_FILE
mov [file_information.Position], 0
mov [file_information.Flags], 0
mov [file_information.Count], ecx
mov [file_information.Buffer], eax
mov byte[file_information+20], 0
mov [file_information.FileName], file_path
mcall SF_FILE,file_information ;загружаем файл изображения
cmp ebx,0xffffffff
je .end_open
;определяем вид изображения и пишем его параметры
mov eax,[ScreenPointer]
add eax,mem_screen+mem_panel_all
stdcall [img_decode], eax,ebx,0
push eax
;определяем размер декодированного изображения
mov ecx,[eax+4] ;+4 = image width
mov dword[Picture_SizeX],ecx
mov eax,[eax+8] ;+8 = image height
mov dword[Picture_SizeY],eax
imul ecx,eax
imul ecx,15
add ecx,mem_screen+mem_panel_all+mem_flood_f
mcall SF_SYS_MISC,SSF_MEM_REALLOC,,[ScreenPointer]
or eax,eax
jnz .have_new_memory
notify_window_run txt_not_memory
pop ebx
jmp @f
.have_new_memory:
;notify_window_run sz_main_menu_File_Open
mov [ScreenPointer],eax
call prepare_data_pointers
pop ebx
stdcall [img_to_rgb2], ebx,[PointerToPicture] ;преобразуем изображение к формату rgb
mov [save_flag],1
@@:
stdcall [img_destroy], ebx ;удаляем временный буфер с параметрами изображения
.end_open:
ret