Libs-dev/libimg/ru

From KolibriOS wiki
Revision as of 10:04, 30 June 2010 by IgorA (talk | contribs) (пример вывода файла png с помощью libimg)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

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

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

Для компиляции в include нужно указать полный путь к папке svn. Программа выводит на экран файл some_file.png размером 200 на 100 пикселей. Для вывода другой картинки нужно указать ее имя и размеры в коде. Подразумевается, что картинка лежит в одной папке с программой. <asm>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 'mem.inc' include '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: 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:</asm>