Libs-dev/libimg/ru

From KolibriOS wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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

Поддерживаемые форматы и глубина цвета для img_encode

PNG: 24, 32
BMP: 24, 32
PNM: 1, 8g, 24

Пример вывода файла *.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 ;not implemented
  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 ;supported formats: PNG 24 32, BMP 24 32, PNM 1 8g 24
  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: