Subversion Repositories Kolibri OS

Rev

Rev 6906 | Details | Compare with Previous | Last modification | View Log | RSS feed

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