Subversion Repositories Kolibri OS

Rev

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
}