Libs-dev/libimg/ru

From KolibriOS wiki
Jump to: navigation, search

libimg.obj - это библиотека с помощью которой можно выводить на экран файлы в форматах bmp, jpg, png. Для вывода изображений на экран можно использовать системную ф. 7. Перед выводом изображение нужно перевести в формат rgb.

Пример вывода файла *.png на экран

Для компиляции в include нужно указать полный путь к папке svn. Программа выводит на экран файл some_file.png размером 200 на 100 пикселей. Для вывода другой картинки нужно указать ее имя и размеры в коде. Подразумевается, что картинка лежит в одной папке с программой.

use32
	org 0x0
	db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт
	dd 0x1
	dd start
	dd i_end ;размер приложения
	dd mem
	dd stacktop
	dd 0x0
	dd sys_path
 
include 'svn/programs/macros.inc'
include 'svn/programs/proc32.inc'
include 'svn/programs/develop/libraries/box_lib/load_lib.mac'
include 'svn/programs/dll.inc'
 
@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc, dll.Load
 
struct FileInfoBlock
	Function dd ?
	Position dd ?
	Flags	 dd ?
	Count	 dd ?
	Buffer	 dd ?
		db ?
	FileName dd ?
ends
 
IMAGE_FILE_SIZE equ 200*100*3 ;размер файла с изображением 200 x 100
fn_icon1 db 'some_file.png',0 ;имя файла с изображением
 
align 4
start:
	load_libraries l_libs_start,load_lib_end
 
	;проверка на сколько удачно загузилась наша либа
	mov	ebp,lib1
	cmp	dword [ebp+ll_struc_size-4],0
	jz	@f
	mcall -1 ;exit not correct
@@:
 
	stdcall mem.Alloc, dword IMAGE_FILE_SIZE ;выделяем память для изображения
	mov [image_data_rgb],eax
 
	copy_path fn_icon1,sys_path,file_name,0x0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой
	mov eax,70 ;70-я функция работа с файлами
	mov [run_file_70.Function], 0
	mov [run_file_70.Position], 0
	mov [run_file_70.Flags], 0
	mov [run_file_70.Count], dword IMAGE_FILE_SIZE
	m2m [run_file_70.Buffer], [image_data_rgb]
	mov byte[run_file_70+20], 0
	mov [run_file_70.FileName], file_name
	mov ebx,run_file_70
	int 0x40 ;загружаем файл изображения
	cmp ebx,0xffffffff
	je @f
		;определяем вид изображения и переводим его во временный буфер image_data
		stdcall dword[img_decode], dword[image_data_rgb],ebx,0
		mov dword[image_data],eax
		;преобразуем изображение к формату rgb
		stdcall dword[img_to_rgb2], dword[image_data],dword[image_data_rgb]
		;удаляем временный буфер image_data
		stdcall dword[img_destroy], dword[image_data]
	@@:
 
	mcall 40,0x27
	mcall 48,3,sc,sizeof.system_colors ;получаем системные цвета
 
align 4
red_win:
	call draw_window
 
align 4
still: ;главный цикл
	mov eax,10
	mcall
 
	cmp al,0x1 ;изменилось положение окна
	jz red_win
	cmp al,0x2
	jz key
	cmp al,0x3
	jz button
 
	jmp still
 
align 4
key:
	push eax ebx
	mcall 2
;...
	pop ebx eax
	jmp still
 
 
align 4
draw_window:
	pushad
	mcall 12,1
 
	xor eax,eax
	mov ebx,20*65536+320
	mov ecx,20*65536+240
	mov edx,[sc.work]
	or  edx,0x33000000
	mov edi,hed
	mcall ;создание окна
 
	mov ecx,(200 shl 16)+100 ;размеры изображения 200 x 100
	mov edx,(10 shl 16)+10   ;отступы слева и сверху по 10 пикселей
	mcall 7,[image_data_rgb] ;вывод изображения на экран
 
	mcall 12,2
	popad
	ret
 
head_f_i:
head_f_l  db 'Системная ошибка',0
err_message_found_lib1 db 'Не удалось найти библиотеку libimg.obj',0
err_message_import1 db 'Ошибка при импорте библиотеки libimg.obj',0
 
system_dir1 db '/sys/lib/'
libimg_name db 'libimg.obj',0
 
;library structures
l_libs_start:
	lib1 l_libs libimg_name, sys_path, file_name, system_dir1, err_message_found_lib1, head_f_l, libimg_import, err_message_import1, head_f_i
load_lib_end:
 
align 4
button:
	mcall 17 ;получить код нажатой кнопки
	cmp ah,1
	jne still
.exit:
	stdcall mem.Free,[image_data_rgb] ;освобождаем память
	mcall -1 ;выход из программы
 
image_data dd 0 ;память для преобразования картинки функциями libimg
image_data_rgb dd 0 ;память с преобразованным изображением в формате rgb
 
run_file_70 FileInfoBlock
hed db 'Draw image 30.06.10',0 ;подпись окна
sc system_colors  ;системные цвета
 
align 4
libimg_import:
  dd alib_init1
  img_is_img  dd aimg_is_img
  img_info    dd aimg_info
  img_from_file dd aimg_from_file
  img_to_file dd aimg_to_file
  img_from_rgb dd aimg_from_rgb
  img_to_rgb  dd aimg_to_rgb
  img_to_rgb2 dd aimg_to_rgb2
  img_decode  dd aimg_decode
  img_encode  dd aimg_encode
  img_create  dd aimg_create
  img_destroy dd aimg_destroy
  img_destroy_layer dd aimg_destroy_layer
  img_count   dd aimg_count
  img_lock_bits dd aimg_lock_bits
  img_unlock_bits dd aimg_unlock_bits
  img_flip    dd aimg_flip
  img_flip_layer dd aimg_flip_layer
  img_rotate  dd aimg_rotate
  img_rotate_layer dd aimg_rotate_layer
  img_draw    dd aimg_draw
 
  dd 0,0
  alib_init1   db 'lib_init',0
  aimg_is_img  db 'img_is_img',0 ;определяет по данным, может ли библиотека сделать из них изображение
  aimg_info    db 'img_info',0
  aimg_from_file db 'img_from_file',0
  aimg_to_file db 'img_to_file',0
  aimg_from_rgb db 'img_from_rgb',0
  aimg_to_rgb  db 'img_to_rgb',0 ;преобразование изображения в данные RGB
  aimg_to_rgb2 db 'img_to_rgb2',0
  aimg_decode  db 'img_decode',0 ;автоматически определяет формат графических данных
  aimg_encode  db 'img_encode',0
  aimg_create  db 'img_create',0
  aimg_destroy db 'img_destroy',0
  aimg_destroy_layer db 'img_destroy_layer',0
  aimg_count   db 'img_count',0
  aimg_lock_bits db 'img_lock_bits',0
  aimg_unlock_bits db 'img_unlock_bits',0
  aimg_flip    db 'img_flip',0
  aimg_flip_layer db 'img_flip_layer',0
  aimg_rotate  db 'img_rotate',0
  aimg_rotate_layer db 'img_rotate_layer',0
  aimg_draw    db 'img_draw',0
 
i_end:
	rb 1024
stacktop:
	sys_path rb 4096
	file_name:
		rb 4096
	plugin_path:
		rb 4096
	openfile_path:
		rb 4096
	filename_area:
		rb 256
mem: