Subversion Repositories Kolibri OS

Rev

Rev 6211 | Rev 6879 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
6200 IgorA 1
;
2
; Макрос для загрузки изображений чрез функции библиотеки libimg.
3
; Действия которые делает макрос load_image_file:
4
;
5
; Проверяет размер полученного файла с изображением.
6
; Выделяет под него память и загружает туда файл.
7
; Определяет размер памяти необходимой для распаковки изображения.
8
; Перевыделяет память, и распаковывает изображение из форматов jpg, png, ...
9
;    в формат rgb который можно выводить на экран через сист. функцию.
10
; При необходимости можно также получить размеры открываемого изображения для
11
;    их дальнейшего использования в программе.
12
;
13
; В использующей программе должна быть подключена библиотека libimg,
14
;    объявлена переменная file_name размером около 4096 байт,
15
;    а также структура run_file_70 типа FileInfoBlock.
16
 
17
; подключение некоторых необходимых файлов:
18
include 'dll.inc'
19
include 'develop/libraries/box_lib/load_lib.mac'
6836 hidnplayr 20
include 'develop/libraries/libs-dev/libio/libio.inc'
6200 IgorA 21
 
22
align 4
23
open_b rb 560
24
 
25
; path - может быть переменной или строковым параметром
6211 IgorA 26
; buf - переменная куда будет записан указатель на изображение в формате rgb,
27
;    в случае если файл не откроется то будет записан 0
6200 IgorA 28
; img_w, img_h - переменные куда будут записаны размеры открываемого
29
;    изображения, не обязательные параметры
30
; bytes_p_p - сколько байт памяти брать на пиксель, не обязательный параметр
31
;    если не указан берется 3. Минимальное значение должно быть не меньше 3.
32
macro load_image_file path, buf, img_w, img_h, bytes_p_p
33
{
34
local .end_open
35
if path eqtype '' ;проверяем задан ли строкой параметр path
6836 hidnplayr 36
        local .path_str
37
        jmp @f
38
                .path_str db path ;формируем локальную переменную
39
                db 0
40
        @@:
41
        ;32 - стандартный адрес по которому должен быть буфер с системным путем
42
        copy_path .path_str,[32],file_name,0
6200 IgorA 43
else
6836 hidnplayr 44
        copy_path path,[32],file_name,0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой
6200 IgorA 45
end if
6836 hidnplayr 46
        mov dword[buf],0
6211 IgorA 47
 
6200 IgorA 48
    mov [run_file_70.Function], SSF_GET_INFO
49
    mov [run_file_70.Position], 0
50
    mov [run_file_70.Flags], 0
51
    mov dword[run_file_70.Count], 0
52
    mov dword[run_file_70.Buffer], open_b
53
    mov byte[run_file_70+20], 0
54
    mov dword[run_file_70.FileName], file_name
55
    mcall SF_FILE,run_file_70
6836 hidnplayr 56
        or eax,eax
57
        jnz .end_open
6200 IgorA 58
 
59
    mov ecx,dword[open_b+32] ;+32 qword: размер файла в байтах
60
    stdcall mem.Alloc,ecx ;выделяем память для изображения
6836 hidnplayr 61
        mov [buf],eax
62
        mov [run_file_70.Function], SSF_READ_FILE
63
        mov [run_file_70.Position], 0
64
        mov [run_file_70.Flags], 0
65
        mov [run_file_70.Count], ecx
66
        mov [run_file_70.Buffer], eax
67
        mov byte[run_file_70+20], 0
68
        mov [run_file_70.FileName], file_name
69
        mcall SF_FILE,run_file_70 ;загружаем файл изображения
70
        cmp ebx,0xffffffff
71
        je .end_open
72
                ;определяем вид изображения и пишем его параметры
73
                stdcall [img_decode], [buf],ebx,0
74
                mov ebx,eax
75
                ;определяем размер декодированного изображения
76
                mov ecx,[eax+4] ;+4 = image width
6200 IgorA 77
if img_w eq
78
else
6836 hidnplayr 79
                mov dword[img_w],ecx
6200 IgorA 80
end if
81
if img_h eq
6836 hidnplayr 82
                imul ecx,[eax+8] ;+8 = image height
6200 IgorA 83
else
6836 hidnplayr 84
                mov eax,[eax+8] ;+8 = image height
85
                mov dword[img_h],eax
86
                imul ecx,eax
6200 IgorA 87
end if
88
if bytes_p_p eq
6836 hidnplayr 89
                imul ecx,3 ;need for r,g,b
6200 IgorA 90
else
6836 hidnplayr 91
                imul ecx,bytes_p_p
6200 IgorA 92
end if
6836 hidnplayr 93
                stdcall mem.ReAlloc,[buf],ecx ;изменяем размер для буфера
94
                mov [buf],eax
95
                stdcall [img_to_rgb2], ebx,[buf] ;преобразуем изображение к формату rgb
96
                stdcall [img_destroy], ebx ;удаляем временный буфер с параметрами изображения
97
        .end_open:
6200 IgorA 98
}