Subversion Repositories Kolibri OS

Rev

Rev 6189 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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