Subversion Repositories Kolibri OS

Rev

Rev 6836 | Rev 6906 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 6836 Rev 6879
Line 1... Line 1...
1
;
1
;
2
; Макрос для загрузки изображений чрез функции библиотеки libimg.
2
; Œ ªà®á ¤«ï § £à㧪¨ ¨§®¡à ¦¥­¨© ç१ ä㭪樨 ¡¨¡«¨®â¥ª¨ libimg.
3
; Действия которые делает макрос load_image_file:
3
; „¥©áâ¢¨ï ª®â®àë¥ ¤¥« ¥â ¬ ªà®á load_image_file:
4
;
4
;
5
; Проверяет размер полученного файла с изображением.
5
; à®¢¥àï¥â à §¬¥à ¯®«ã祭­®£® ä ©«  á ¨§®¡à ¦¥­¨¥¬.
6
; Выделяет под него память и загружает туда файл.
6
; ‚뤥«ï¥â ¯®¤ ­¥£® ¯ ¬ïâì ¨ § £à㦠¥â â㤠 ä ©«.
7
; Определяет размер памяти необходимой для распаковки изображения.
7
; Ž¯à¥¤¥«ï¥â à §¬¥à ¯ ¬ï⨠­¥®¡å®¤¨¬®© ¤«ï à á¯ ª®¢ª¨ ¨§®¡à ¦¥­¨ï.
8
; Перевыделяет память, и распаковывает изображение из форматов jpg, png, ...
8
; ¥à¥¢ë¤¥«ï¥â ¯ ¬ïâì, ¨ à á¯ ª®¢ë¢ ¥â ¨§®¡à ¦¥­¨¥ ¨§ ä®à¬ â®¢ jpg, png, ...
9
;    в формат rgb который можно выводить на экран через сист. функцию.
9
;    ¢ ä®à¬ â rgb ª®â®àë© ¬®¦­® ¢ë¢®¤¨âì ­  íªà ­ ç¥à¥§ á¨áâ. äã­ªæ¨î.
10
; При необходимости можно также получить размеры открываемого изображения для
10
; à¨ ­¥®¡å®¤¨¬®á⨠¬®¦­® â ª¦¥ ¯®«ãç¨âì à §¬¥àë ®âªà뢠¥¬®£® ¨§®¡à ¦¥­¨ï ¤«ï
11
;    их дальнейшего использования в программе.
11
;    ¨å ¤ «ì­¥©è¥£® ¨á¯®«ì§®¢ ­¨ï ¢ ¯à®£à ¬¬¥.
12
;
12
;
13
; В использующей программе должна быть подключена библиотека libimg,
13
; ‚ ¨á¯®«ì§ãî饩 ¯à®£à ¬¬¥ ¤®«¦­  ¡ëâì ¯®¤ª«î祭  ¡¨¡«¨®â¥ª  libimg,
14
;    объявлена переменная file_name размером около 4096 байт,
14
;    ®¡ê¥­  ¯¥à¥¬¥­­ ï file_name à §¬¥à®¬ ®ª®«® 4096 ¡ ©â,
15
;    а также структура run_file_70 типа FileInfoBlock.
15
;      â ª¦¥ áâàãªâãà  run_file_70 ⨯  FileInfoBlock.
Line 16... Line 16...
16
 
16
 
17
; подключение некоторых необходимых файлов:
17
; ¯®¤ª«î祭¨¥ ­¥ª®â®àëå ­¥®¡å®¤¨¬ëå ä ©«®¢:
18
include 'dll.inc'
18
include 'dll.inc'
19
include 'develop/libraries/box_lib/load_lib.mac'
19
include 'develop/libraries/box_lib/load_lib.mac'
Line 20... Line 20...
20
include 'develop/libraries/libs-dev/libio/libio.inc'
20
include 'develop/libraries/libs-dev/libio/libio.inc'
21
 
21
 
Line -... Line 22...
-
 
22
align 4
-
 
23
open_b rb 560
-
 
24
 
-
 
25
txt_err_img_file:
-
 
26
if lang eq ru
-
 
27
	db 'Žè¨¡ª  N'
-
 
28
.n: db '* ¯à¨ ®âªàë⨨ ä ©«  '
-
 
29
else
-
 
30
	db 'Error N'
-
 
31
.n: db '*. Can',39,'t open file '
22
align 4
32
end if
23
open_b rb 560
33
.f: dd 0,0
24
 
34
 
25
; path - может быть переменной или строковым параметром
35
; path - ¬®¦¥â ¡ëâì ¯¥à¥¬¥­­®© ¨«¨ áâப®¢ë¬ ¯ à ¬¥â஬
26
; buf - переменная куда будет записан указатель на изображение в формате rgb,
36
; buf - ¯¥à¥¬¥­­ ï ªã¤  ¡ã¤¥â § ¯¨á ­ 㪠§ â¥«ì ­  ¨§®¡à ¦¥­¨¥ ¢ ä®à¬ â¥ rgb,
27
;    в случае если файл не откроется то будет записан 0
37
;    ¢ á«ãç ¥ ¥á«¨ ä ©« ­¥ ®âªà®¥âáï â® ¡ã¤¥â § ¯¨á ­ 0
28
; img_w, img_h - переменные куда будут записаны размеры открываемого
38
; img_w, img_h - ¯¥à¥¬¥­­ë¥ ªã¤  ¡ã¤ãâ § ¯¨á ­ë à §¬¥àë ®âªà뢠¥¬®£®
29
;    изображения, не обязательные параметры
39
;    ¨§®¡à ¦¥­¨ï, ­¥ ®¡ï§ â¥«ì­ë¥ ¯ à ¬¥âàë
30
; bytes_p_p - сколько байт памяти брать на пиксель, не обязательный параметр
40
; bytes_p_p - ᪮«ìª® ¡ ©â ¯ ¬ï⨠¡à âì ­  ¯¨ªá¥«ì, ­¥ ®¡ï§ â¥«ì­ë© ¯ à ¬¥âà
-
 
41
;    ¥á«¨ ­¥ 㪠§ ­ ¡¥à¥âáï 3. Œ¨­¨¬ «ì­®¥ §­ ç¥­¨¥ ¤®«¦­® ¡ëâì ­¥ ¬¥­ìè¥ 3.
31
;    если не указан берется 3. Минимальное значение должно быть не меньше 3.
42
macro load_image_file path, buf, img_w, img_h, bytes_p_p
-
 
43
{
32
macro load_image_file path, buf, img_w, img_h, bytes_p_p
44
local .err_open
33
{
45
local .end_open
34
local .end_open
46
 
35
if path eqtype '' ;проверяем задан ли строкой параметр path
47
if path eqtype '' ;¯à®¢¥à塞 § ¤ ­ «¨ áâப®© ¯ à ¬¥âà path
36
        local .path_str
48
        local .path_str
37
        jmp @f
49
        jmp @f
38
                .path_str db path ;формируем локальную переменную
50
                .path_str db path ;ä®à¬¨à㥬 «®ª «ì­ãî ¯¥à¥¬¥­­ãî
39
                db 0
51
                db 0
40
        @@:
52
        @@:
41
        ;32 - стандартный адрес по которому должен быть буфер с системным путем
53
        ;32 - áâ ­¤ àâ­ë©  ¤à¥á ¯® ª®â®à®¬ã ¤®«¦¥­ ¡ëâì ¡ãä¥à á á¨á⥬­ë¬ ¯ã⥬
42
        copy_path .path_str,[32],file_name,0
54
        copy_path .path_str,[32],file_name,0
43
else
55
else
Line 44... Line 56...
44
        copy_path path,[32],file_name,0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой
56
        copy_path path,[32],file_name,0 ;ä®à¬¨à㥬 ¯®«­ë© ¯ãâì ª ä ©«ã ¨§®¡à ¦¥­¨ï, ¯®¤à §ã¬¥¢ ¥¬ çâ® ®­ ¢ ®¤­®© ¯ ¯ª¥ á ¯à®£à ¬¬®©
45
end if
57
end if
Line 52... Line 64...
52
    mov dword[run_file_70.Buffer], open_b
64
    mov dword[run_file_70.Buffer], open_b
53
    mov byte[run_file_70+20], 0
65
    mov byte[run_file_70+20], 0
54
    mov dword[run_file_70.FileName], file_name
66
    mov dword[run_file_70.FileName], file_name
55
    mcall SF_FILE,run_file_70
67
    mcall SF_FILE,run_file_70
56
        or eax,eax
68
        or eax,eax
57
        jnz .end_open
69
        jnz .err_open
Line 58... Line 70...
58
 
70
 
59
    mov ecx,dword[open_b+32] ;+32 qword: размер файла в байтах
71
    mov ecx,dword[open_b+32] ;+32 qword: à §¬¥à ä ©«  ¢ ¡ ©â å
60
    stdcall mem.Alloc,ecx ;выделяем память для изображения
72
    stdcall mem.Alloc,ecx ;¢ë¤¥«ï¥¬ ¯ ¬ïâì ¤«ï ¨§®¡à ¦¥­¨ï
61
        mov [buf],eax
73
        mov [buf],eax
62
        mov [run_file_70.Function], SSF_READ_FILE
74
        mov [run_file_70.Function], SSF_READ_FILE
63
        mov [run_file_70.Position], 0
75
        mov [run_file_70.Position], 0
64
        mov [run_file_70.Flags], 0
76
        mov [run_file_70.Flags], 0
65
        mov [run_file_70.Count], ecx
77
        mov [run_file_70.Count], ecx
66
        mov [run_file_70.Buffer], eax
78
        mov [run_file_70.Buffer], eax
67
        mov byte[run_file_70+20], 0
79
        mov byte[run_file_70+20], 0
68
        mov [run_file_70.FileName], file_name
80
        mov [run_file_70.FileName], file_name
-
 
81
        mcall SF_FILE,run_file_70 ;§ £à㦠¥¬ ä ©« ¨§®¡à ¦¥­¨ï
-
 
82
		test eax,eax
69
        mcall SF_FILE,run_file_70 ;загружаем файл изображения
83
		jnz .err_open
70
        cmp ebx,0xffffffff
84
        cmp ebx,0xffffffff
71
        je .end_open
85
        je .end_open
72
                ;определяем вид изображения и пишем его параметры
86
                ;®¯à¥¤¥«ï¥¬ ¢¨¤ ¨§®¡à ¦¥­¨ï ¨ ¯¨è¥¬ ¥£® ¯ à ¬¥âàë
73
                stdcall [img_decode], [buf],ebx,0
87
                stdcall [img_decode], [buf],ebx,0
74
                mov ebx,eax
88
                mov ebx,eax
75
                ;определяем размер декодированного изображения
89
                ;®¯à¥¤¥«ï¥¬ à §¬¥à ¤¥ª®¤¨à®¢ ­­®£® ¨§®¡à ¦¥­¨ï
76
                mov ecx,[eax+4] ;+4 = image width
90
                mov ecx,[eax+4] ;+4 = image width
77
if img_w eq
91
if img_w eq
78
else
92
else
79
                mov dword[img_w],ecx
93
                mov dword[img_w],ecx
Line 88... Line 102...
88
if bytes_p_p eq
102
if bytes_p_p eq
89
                imul ecx,3 ;need for r,g,b
103
                imul ecx,3 ;need for r,g,b
90
else
104
else
91
                imul ecx,bytes_p_p
105
                imul ecx,bytes_p_p
92
end if
106
end if
93
                stdcall mem.ReAlloc,[buf],ecx ;изменяем размер для буфера
107
                stdcall mem.ReAlloc,[buf],ecx ;¨§¬¥­ï¥¬ à §¬¥à ¤«ï ¡ãä¥à 
94
                mov [buf],eax
108
                mov [buf],eax
95
                stdcall [img_to_rgb2], ebx,[buf] ;преобразуем изображение к формату rgb
109
                stdcall [img_to_rgb2], ebx,[buf] ;¯à¥®¡à §ã¥¬ ¨§®¡à ¦¥­¨¥ ª ä®à¬ âã rgb
96
                stdcall [img_destroy], ebx ;удаляем временный буфер с параметрами изображения
110
                stdcall [img_destroy], ebx ;㤠«ï¥¬ ¢à¥¬¥­­ë© ¡ãä¥à á ¯ à ¬¥âà ¬¨ ¨§®¡à ¦¥­¨ï
-
 
111
			jmp .end_open
-
 
112
		.err_open:
-
 
113
			add al,'0'
-
 
114
			mov byte[txt_err_img_file.n],al
-
 
115
if path eqtype ''
-
 
116
			mov eax,dword[.path_str]
-
 
117
			mov dword[txt_err_img_file.f],eax
-
 
118
			mov eax,dword[.path_str+4]
-
 
119
else
-
 
120
			mov eax,dword[path]
-
 
121
			mov dword[txt_err_img_file.f],eax
-
 
122
			mov eax,dword[path+4]
-
 
123
end if
-
 
124
			mov dword[txt_err_img_file.f+4],eax
-
 
125
			mov byte[txt_err_img_file.f+7],0
-
 
126
			notify_window_run txt_err_img_file
97
        .end_open:
127
        .end_open:
98
}
128
}