Subversion Repositories Kolibri OS

Rev

Rev 6189 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
6189 IgorA 1
;include 'zgl.inc'
2
 
3
align 16
4
proc gl_resizeImage uses ecx edi esi, dest:dword, xsize_dest:dword, ysize_dest:dword,\
5
	src:dword, xsize_src:dword, ysize_src:dword
6
 
7
	;сжатие по ширине
8
	mov edi,[xsize_src]
9
	cmp edi,[xsize_dest]
10
	jle @f
11
		stdcall img_rgb24_wresize, [src],edi,[ysize_src],[xsize_dest]
12
		mov edi,[xsize_dest]
13
	@@:
14
 
15
	;сжатие по высоте
16
	mov ecx,[ysize_src]
17
	cmp ecx,[ysize_dest]
18
	jle @f
19
		stdcall img_rgb24_hresize, [src],edi,ecx,[ysize_dest]
20
		mov ecx,[ysize_dest]
21
	@@:
22
 
23
	;копирование сжатой текстуры
24
	imul ecx,edi
25
	mov edi,[dest]
26
	mov esi,[src]
27
	imul ecx,3
28
	rep movsb
29
	ret
30
endp
31
 
32
;description:
33
; сжатие изображения по ширине (размеры буфера не меняются)
34
;input:
35
; data_rgb - pointer to rgb data
36
; size_w - width img in pixels
37
; size_h - height img in pixels
38
; size_w_new - new width img in pixels
39
align 16
40
proc img_rgb24_wresize, data_rgb:dword, size_w:dword, size_h:dword, size_w_new:dword
41
locals
42
	pr dd 0
43
	pg dd 0
44
	pb dd 0
45
	img_n dd ? ;указатель на данные нового изображения
46
	lines dd ?
47
endl
48
pushad
49
;eax - delta for inp. img
50
;ebx - delta for outp. img
51
;esi - pointer to data_rgb
52
	mov esi,[data_rgb]
53
	mov [img_n],esi
54
	mov eax,[size_h]
55
	mov [lines],eax
56
align 4
57
	.cycyle_0:
58
	mov eax,[size_w_new]
59
	mov ecx,[size_w]
60
	mov ebx,ecx
61
align 4
62
	.cycyle_1:
63
		cmp eax,ebx
64
		jg .else_0
65
			;копируемый пиксель максимально влияет на результат
66
			;накапливаем rgb для интерполяции пикселей
67
			mov edx,[size_w_new]
68
			movzx edi,byte[esi]
69
			imul edi,edx
70
			add [pb],edi
71
			movzx edi,byte[esi+1]
72
			imul edi,edx
73
			add [pg],edi
74
			movzx edi,byte[esi+2]
75
			imul edi,edx
76
			add [pr],edi
77
			cmp eax,ebx
78
			je .d2_add
79
			jmp .if_0_end
80
		.else_0:
81
			;копируемый пиксель попадет на границу пикселей
82
			mov edx,ebx
83
			sub edx,eax
84
			add edx,[size_w_new]
85
			movzx edi,byte[esi]
86
			imul edi,edx
87
			add [pb],edi
88
			movzx edi,byte[esi+1]
89
			imul edi,edx
90
			add [pg],edi
91
			movzx edi,byte[esi+2]
92
			imul edi,edx
93
			add [pr],edi
94
			;сохраняем готовое rgb
95
			.d2_add:
96
			push eax
97
				mov edi,[img_n]
98
				mov eax,[pb]
99
				xor edx,edx
100
				div dword[size_w] ;eax /= [size_w]
101
				stosb
102
				mov eax,[pg]
103
				xor edx,edx
104
				div dword[size_w] ;eax /= [size_w]
105
				stosb
106
				mov eax,[pr]
107
				xor edx,edx
108
				div dword[size_w] ;eax /= [size_w]
109
				stosb
110
			pop eax
111
			add dword[img_n],3 ;next pixel
112
			;обновляем rgb для нового пикселя
113
			mov edx,eax
114
			sub edx,ebx
115
			movzx edi,byte[esi]
116
			imul edi,edx
117
			mov [pb],edi
118
			movzx edi,byte[esi+1]
119
			imul edi,edx
120
			mov [pg],edi
121
			movzx edi,byte[esi+2]
122
			imul edi,edx
123
			mov [pr],edi
124
			add ebx,[size_w]
125
		.if_0_end:
126
		add eax,[size_w_new]
127
		add esi,3 ;next pixel
128
		dec ecx
129
		jnz .cycyle_1
130
	dec dword[lines]
131
	jnz .cycyle_0
132
popad
133
	ret
134
endp
135
 
136
;description:
137
; сжатие изображения по высоте (размеры буфера не меняются)
138
;input:
139
; data_rgb - pointer to rgb data
140
; size_w - width img in pixels
141
; size_h - height img in pixels
142
; size_h_new - new height img in pixels
143
align 16
144
proc img_rgb24_hresize, data_rgb:dword, size_w:dword, size_h:dword, size_h_new:dword
145
locals
146
	pr dd 0
147
	pg dd 0
148
	pb dd 0
149
	img_n dd ? ;указатель на данные нового изображения
150
	cols dd ?
151
	lin_b dd ? ;размер линии изображения в байтах
152
	data_n dd ? ;указатель на данные для нового столбца пикселей
153
endl
154
pushad
155
;eax - delta for inp. img
156
;ebx - delta for outp. img
157
;esi - pointer to data_rgb
158
	mov esi,[data_rgb]
159
	mov [data_n],esi
160
	mov eax,[size_w]
161
	mov [cols],eax
162
	lea eax,[eax+eax*2]
163
	mov [lin_b],eax
164
align 4
165
	.cycyle_0:
166
	mov eax,[size_h_new]
167
	mov ecx,[size_h]
168
	mov ebx,ecx
169
	mov esi,[data_n]
170
	mov [img_n],esi
171
	add dword[data_n],3 ;переход на следующий столбец пикселей
172
align 4
173
	.cycyle_1:
174
		cmp eax,ebx
175
		jg .else_0
176
			;копируемый пиксель максимально влияет на результат
177
			;накапливаем rgb для интерполяции пикселей
178
			mov edx,[size_h_new]
179
			movzx edi,byte[esi]
180
			imul edi,edx
181
			add [pb],edi
182
			movzx edi,byte[esi+1]
183
			imul edi,edx
184
			add [pg],edi
185
			movzx edi,byte[esi+2]
186
			imul edi,edx
187
			add [pr],edi
188
			cmp eax,ebx
189
			je .d2_add
190
			jmp .if_0_end
191
		.else_0:
192
			;копируемый пиксель попадет на границу пикселей
193
			mov edx,ebx
194
			sub edx,eax
195
			add edx,[size_h_new]
196
			movzx edi,byte[esi]
197
			imul edi,edx
198
			add [pb],edi
199
			movzx edi,byte[esi+1]
200
			imul edi,edx
201
			add [pg],edi
202
			movzx edi,byte[esi+2]
203
			imul edi,edx
204
			add [pr],edi
205
			;сохраняем готовое rgb
206
			.d2_add:
207
			push eax
208
				mov edi,[img_n]
209
				mov eax,[pb]
210
				xor edx,edx
211
				div dword[size_h] ;eax /= [size_h]
212
				stosb
213
				mov eax,[pg]
214
				xor edx,edx
215
				div dword[size_h] ;eax /= [size_h]
216
				stosb
217
				mov eax,[pr]
218
				xor edx,edx
219
				div dword[size_h] ;eax /= [size_h]
220
				stosb
221
			pop eax
222
			mov edx,[lin_b]
223
			add dword[img_n],edx ;next pixel
224
			;обновляем rgb для нового пикселя
225
			mov edx,eax
226
			sub edx,ebx
227
			movzx edi,byte[esi]
228
			imul edi,edx
229
			mov [pb],edi
230
			movzx edi,byte[esi+1]
231
			imul edi,edx
232
			mov [pg],edi
233
			movzx edi,byte[esi+2]
234
			imul edi,edx
235
			mov [pr],edi
236
			add ebx,[size_h]
237
		.if_0_end:
238
		add eax,[size_h_new]
239
		add esi,[lin_b] ;next pixel
240
		dec ecx
241
		jnz .cycyle_1
242
	dec dword[cols]
243
	jnz .cycyle_0
244
popad
245
	ret
6243 IgorA 246
endp
247
 
248
align 4
249
proc gl_getPervPowerOfTwo uses ebx, n:dword
250
	mov ebx,[n]
251
	mov eax,(1 shl ZB_POINT_TEXEL_SIZE) ;max size
252
	cmp ebx,eax
253
	jge .set
254
	@@:
255
		shr eax,1
256
		cmp ebx,eax
257
		jl @b
258
	cmp eax,8 ;min size
259
	jge .set
260
		mov eax,8
261
	.set:
262
	ret
6189 IgorA 263
endp