Subversion Repositories Kolibri OS

Rev

Rev 6836 | Rev 6906 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
6200 IgorA 1
;
6879 IgorA 2
; Макрос для загрузки изображений чрез функции библиотеки libimg.
3
; Действия которые делает макрос load_image_file:
6200 IgorA 4
;
6879 IgorA 5
; Проверяет размер полученного файла с изображением.
6
; Выделяет под него память и загружает туда файл.
7
; Определяет размер памяти необходимой для распаковки изображения.
8
; Перевыделяет память, и распаковывает изображение из форматов jpg, png, ...
9
;    в формат rgb который можно выводить на экран через сист. функцию.
10
; При необходимости можно также получить размеры открываемого изображения для
11
;    их дальнейшего использования в программе.
6200 IgorA 12
;
6879 IgorA 13
; В использующей программе должна быть подключена библиотека libimg,
14
;    объявлена переменная file_name размером около 4096 байт,
15
;    а также структура run_file_70 типа FileInfoBlock.
6200 IgorA 16
 
6879 IgorA 17
; подключение некоторых необходимых файлов:
6200 IgorA 18
include 'dll.inc'
19
include 'develop/libraries/box_lib/load_lib.mac'
6836 hidnplayr 20
include 'develop/libraries/libs-dev/libio/libio.inc'
6200 IgorA 21
 
22
align 4
23
open_b rb 560
24
 
6879 IgorA 25
txt_err_img_file:
26
if lang eq ru
27
	db 'Ошибка N'
28
.n: db '* при открытии файла '
29
else
30
	db 'Error N'
31
.n: db '*. Can',39,'t open file '
32
end if
33
.f: dd 0,0
34
 
35
; path - может быть переменной или строковым параметром
36
; buf - переменная куда будет записан указатель на изображение в формате rgb,
37
;    в случае если файл не откроется то будет записан 0
38
; img_w, img_h - переменные куда будут записаны размеры открываемого
39
;    изображения, не обязательные параметры
40
; bytes_p_p - сколько байт памяти брать на пиксель, не обязательный параметр
41
;    если не указан берется 3. Минимальное значение должно быть не меньше 3.
6200 IgorA 42
macro load_image_file path, buf, img_w, img_h, bytes_p_p
43
{
6879 IgorA 44
local .err_open
6200 IgorA 45
local .end_open
6879 IgorA 46
 
47
if path eqtype '' ;проверяем задан ли строкой параметр path
6836 hidnplayr 48
        local .path_str
49
        jmp @f
6879 IgorA 50
                .path_str db path ;формируем локальную переменную
6836 hidnplayr 51
                db 0
52
        @@:
6879 IgorA 53
        ;32 - стандартный адрес по которому должен быть буфер с системным путем
6836 hidnplayr 54
        copy_path .path_str,[32],file_name,0
6200 IgorA 55
else
6879 IgorA 56
        copy_path path,[32],file_name,0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой
6200 IgorA 57
end if
6836 hidnplayr 58
        mov dword[buf],0
6211 IgorA 59
 
6200 IgorA 60
    mov [run_file_70.Function], SSF_GET_INFO
61
    mov [run_file_70.Position], 0
62
    mov [run_file_70.Flags], 0
63
    mov dword[run_file_70.Count], 0
64
    mov dword[run_file_70.Buffer], open_b
65
    mov byte[run_file_70+20], 0
66
    mov dword[run_file_70.FileName], file_name
67
    mcall SF_FILE,run_file_70
6836 hidnplayr 68
        or eax,eax
6879 IgorA 69
        jnz .err_open
6200 IgorA 70
 
6879 IgorA 71
    mov ecx,dword[open_b+32] ;+32 qword: размер файла в байтах
72
    stdcall mem.Alloc,ecx ;выделяем память для изображения
6836 hidnplayr 73
        mov [buf],eax
74
        mov [run_file_70.Function], SSF_READ_FILE
75
        mov [run_file_70.Position], 0
76
        mov [run_file_70.Flags], 0
77
        mov [run_file_70.Count], ecx
78
        mov [run_file_70.Buffer], eax
79
        mov byte[run_file_70+20], 0
80
        mov [run_file_70.FileName], file_name
6879 IgorA 81
        mcall SF_FILE,run_file_70 ;загружаем файл изображения
82
		test eax,eax
83
		jnz .err_open
6836 hidnplayr 84
        cmp ebx,0xffffffff
85
        je .end_open
6879 IgorA 86
                ;определяем вид изображения и пишем его параметры
6836 hidnplayr 87
                stdcall [img_decode], [buf],ebx,0
88
                mov ebx,eax
6879 IgorA 89
                ;определяем размер декодированного изображения
6836 hidnplayr 90
                mov ecx,[eax+4] ;+4 = image width
6200 IgorA 91
if img_w eq
92
else
6836 hidnplayr 93
                mov dword[img_w],ecx
6200 IgorA 94
end if
95
if img_h eq
6836 hidnplayr 96
                imul ecx,[eax+8] ;+8 = image height
6200 IgorA 97
else
6836 hidnplayr 98
                mov eax,[eax+8] ;+8 = image height
99
                mov dword[img_h],eax
100
                imul ecx,eax
6200 IgorA 101
end if
102
if bytes_p_p eq
6836 hidnplayr 103
                imul ecx,3 ;need for r,g,b
6200 IgorA 104
else
6836 hidnplayr 105
                imul ecx,bytes_p_p
6200 IgorA 106
end if
6879 IgorA 107
                stdcall mem.ReAlloc,[buf],ecx ;изменяем размер для буфера
6836 hidnplayr 108
                mov [buf],eax
6879 IgorA 109
                stdcall [img_to_rgb2], ebx,[buf] ;преобразуем изображение к формату rgb
110
                stdcall [img_destroy], ebx ;удаляем временный буфер с параметрами изображения
111
			jmp .end_open
112
		.err_open:
113
			add al,'0'
114
			mov byte[txt_err_img_file.n],al
115
if path eqtype ''
116
			mov eax,dword[.path_str]
117
			mov dword[txt_err_img_file.f],eax
118
			mov eax,dword[.path_str+4]
119
else
120
			mov eax,dword[path]
121
			mov dword[txt_err_img_file.f],eax
122
			mov eax,dword[path+4]
123
end if
124
			mov dword[txt_err_img_file.f+4],eax
125
			mov byte[txt_err_img_file.f+7],0
126
			notify_window_run txt_err_img_file
6836 hidnplayr 127
        .end_open:
6200 IgorA 128
}