Subversion Repositories Kolibri OS

Rev

Rev 6807 | Rev 8394 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 6807 Rev 7105
Line 31... Line 31...
31
;> [_param]    = depends on _flags fields, see libimg.inc                                         ;;
31
;> [_param]    = depends on _flags fields, see libimg.inc                                         ;;
32
;;------------------------------------------------------------------------------------------------;;
32
;;------------------------------------------------------------------------------------------------;;
33
;< eax = 0 / pointer to converted image                                                           ;;
33
;< eax = 0 / pointer to converted image                                                           ;;
34
;< ecx = error code / undefined                                                                   ;;
34
;< ecx = error code / undefined                                                                   ;;
35
;;================================================================================================;;
35
;;================================================================================================;;
-
 
36
locals
-
 
37
        img     dd ?
-
 
38
        prev    dd ?
-
 
39
endl
36
        push    ebx esi edi 0 0
40
        push    ebx esi edi
-
 
41
        mov     [img], 0
-
 
42
        mov     [prev], 0
37
        mov     ebx, [_src]
43
        mov     ebx, [_src]
38
    @@:
44
    @@:
39
        mov     eax, [ebx + Image.Previous]
45
        mov     eax, [ebx + Image.Previous]
40
        test    eax, eax
46
        test    eax, eax
41
        jz      .loop
47
        jz      .loop
Line 43... Line 49...
43
        jmp     @b
49
        jmp     @b
44
  .loop:
50
  .loop:
45
        stdcall img.convert.layer, ebx, [_dst], [_dst_type], [_flags], [_param]
51
        stdcall img.convert.layer, ebx, [_dst], [_dst_type], [_flags], [_param]
46
        test    eax, eax
52
        test    eax, eax
47
        jz      .error
53
        jz      .error
48
        cmp     dword[esp + 4], 0
54
        cmp     [img], 0
49
        jnz     @f
55
        jnz     @f
50
        mov     [esp + 4], eax
56
        mov     [img], eax
51
    @@:
57
    @@:
52
        mov     ecx, [esp]
58
        mov     ecx, [prev]
53
        jecxz   @f
59
        jecxz   @f
54
        mov     [ecx + Image.Next], eax
60
        mov     [ecx + Image.Next], eax
55
    @@:
-
 
56
	push	[ebx + Image.Flags]
-
 
57
	pop	[eax + Image.Flags]
-
 
58
	push	[ebx + Image.Delay]
-
 
59
	pop	[eax + Image.Delay]
-
 
60
        mov     [eax + Image.Previous], ecx
61
        mov     [eax + Image.Previous], ecx
-
 
62
    @@:
61
        mov     [esp], eax
63
        mov     [prev], eax
-
 
64
        push    [ebx + Image.Flags]
-
 
65
        pop     [eax + Image.Flags]
-
 
66
        push    [ebx + Image.Delay]
-
 
67
        pop     [eax + Image.Delay]
62
        mov     ebx, [ebx + Image.Next]
68
        mov     ebx, [ebx + Image.Next]
63
        test    ebx, ebx
69
        test    ebx, ebx
64
        jnz     .loop
70
        jnz     .loop
65
  .quit:
-
 
66
        pop     eax eax edi esi ebx
71
        mov     eax, [img]
67
        ret
-
 
68
  .error:
72
  .error:
69
        pop     eax eax edi esi ebx
73
        pop     edi esi ebx
70
        ret
74
        ret
71
endp
75
endp
Line 72... Line 76...
72
 
76
 
Line 84... Line 88...
84
;;------------------------------------------------------------------------------------------------;;
88
;;------------------------------------------------------------------------------------------------;;
85
;< eax = 0 / pointer to converted image                                                           ;;
89
;< eax = 0 / pointer to converted image                                                           ;;
86
;< ecx = error code / undefined                                                                   ;;
90
;< ecx = error code / undefined                                                                   ;;
87
;;================================================================================================;;
91
;;================================================================================================;;
88
locals
92
locals
89
	width	rd 1
-
 
90
	height	rd 1
93
        fun     rd 1
91
endl
94
endl
92
        push    ebx esi edi
95
        push    ebx esi edi
Line 93... Line 96...
93
 
96
 
94
	mov	ebx, [_src]
97
        mov     ebx, [_src]
95
	mov	eax, 1
98
        mov     eax, [ebx + Image.Type]
96
	mov	ecx, [_dst_type]
99
        mov     esi, [img.convert.table + 4*eax]
97
	shl	eax, cl
100
  .next:
98
	mov	ecx, [ebx + Image.Type]
101
        lodsd
99
	test	eax, [img.types_table + 4*ecx]
102
        test    eax, eax
100
	jnz	@f
103
        jnz     @f
101
	mov	ecx, LIBIMG_ERROR_BIT_DEPTH
104
        mov     ecx, LIBIMG_ERROR_BIT_DEPTH
102
	jmp	.error
105
        jmp     .exit
-
 
106
    @@:
-
 
107
        cmp     eax, [_dst_type]
-
 
108
        lodsd
-
 
109
        jnz     .next
-
 
110
        mov     [fun], eax
103
    @@:
111
 
104
	mov	eax, [_dst]
112
        mov     eax, [_dst]
105
	test	eax, eax
113
        test    eax, eax
106
	jnz	@f
114
        jnz     @f
107
	stdcall	img.create, [ebx + Image.Width], [ebx + Image.Height], [_dst_type]
115
        stdcall img.create, [ebx + Image.Width], [ebx + Image.Height], [_dst_type]
108
	test	eax, eax
116
        test    eax, eax
109
	jz	.error
117
        jz      .exit
110
	mov	[_dst], eax
118
        mov     [_dst], eax
111
    @@:
119
    @@:
112
	mov	edi, [eax + Image.Data]
120
        mov     edi, [eax + Image.Data]
113
	mov	esi, [ebx + Image.Data]
121
        mov     esi, [ebx + Image.Data]
114
	mov	eax, [ebx + Image.Type]
-
 
115
	cmp	eax, Image.bpp8i
-
 
116
	je	.bpp8i
-
 
117
	cmp	eax, Image.bpp8g
-
 
118
	je	.bpp8g
-
 
119
	cmp	eax, Image.bpp24
-
 
120
	je	.bpp24
-
 
121
	cmp	eax, Image.bpp32
-
 
122
	je	.bpp32
-
 
123
	cmp	eax, Image.bpp15
-
 
124
	je	.bpp15
-
 
125
	cmp	eax, Image.bpp16
-
 
126
	je	.bpp16
-
 
127
	cmp	eax, Image.bpp1
-
 
128
	je	.bpp1
-
 
129
	cmp	eax, Image.bpp8a
-
 
130
	je	.bpp8a
-
 
131
	mov	ecx, LIBIMG_ERROR_BIT_DEPTH
-
 
132
	jmp	.error
-
 
133
 
122
        mov     eax, [ebx + Image.Type]
134
  .find_in_table_and_jump:
123
        stdcall [fun], [_src], [_dst]
135
	mov	ecx, [_dst_type]
124
        mov     eax, [_dst]
136
    @@:
125
  .exit:
137
	mov	eax, [edx]
126
        pop     edi esi ebx
138
	add	edx, 8
-
 
139
	cmp	eax, ecx
127
        ret
140
	jne	@b
-
 
141
	jmp	dword[edx - 4]
-
 
142
 
128
endp
143
 
-
 
144
  .bpp8i:
129
 
145
	mov	edx, img.convert.bpp8i.table
-
 
146
	jmp	.find_in_table_and_jump
-
 
147
  .bpp8i_to_bpp24:
130
proc img._.convert.bpp8i_to_bpp24 _src, _dst
148
	mov	ecx, [ebx + Image.Width]
131
        mov     ecx, [ebx + Image.Width]
149
	imul	ecx, [ebx + Image.Height]
132
        imul    ecx, [ebx + Image.Height]
150
 
133
 
151
	mov	ebx, [ebx + Image.Palette]
134
        mov     ebx, [ebx + Image.Palette]
152
	sub	ecx, 1
135
        sub     ecx, 1
153
	jz	.bpp8i.last
136
        jz      .bpp8i.last
154
    @@:
137
    @@:
155
	movzx	eax, byte[esi]
138
        movzx   eax, byte[esi]
156
	add	esi, 1
139
        add     esi, 1
157
	mov	eax, [ebx + eax*4]
140
        mov     eax, [ebx + eax*4]
158
	mov	[edi], eax
141
        mov     [edi], eax
159
	add	edi, 3
142
        add     edi, 3
160
	sub	ecx, 1
143
        sub     ecx, 1
161
	jnz	@b
144
        jnz     @b
162
  .bpp8i.last:
145
  .bpp8i.last:
163
	movzx	eax, byte[esi]
146
        movzx   eax, byte[esi]
164
	mov	eax, [ebx + eax*4]
147
        mov     eax, [ebx + eax*4]
165
	mov	[edi], ax
148
        mov     [edi], ax
166
	shr	eax, 16
149
        shr     eax, 16
167
	mov	[edi + 2], al
150
        mov     [edi + 2], al
168
	mov	eax, [_dst]
151
        ret
Line -... Line 152...
-
 
152
endp
-
 
153
 
-
 
154
 
-
 
155
proc img._.convert.bpp8i_to_bpp32 _src, _dst
-
 
156
        mov     ecx, [ebx + Image.Width]
-
 
157
        imul    ecx, [ebx + Image.Height]
-
 
158
 
-
 
159
        mov     ebx, [ebx + Image.Palette]
-
 
160
    @@:
-
 
161
        movzx   eax, byte[esi]
-
 
162
        add     esi, 1
-
 
163
        mov     eax, [ebx + eax*4]
-
 
164
        mov     [edi], eax
-
 
165
        add     edi, 4
-
 
166
        dec     ecx
-
 
167
        jnz     @b
Line 169... Line -...
169
	jmp	.quit
-
 
170
 
168
        ret
171
 
-
 
172
 
-
 
173
  .bpp8g:
169
endp
174
	mov	edx, img.convert.bpp8g.table
170
 
175
	jmp	.find_in_table_and_jump
171
 
176
  .bpp8g_to_bpp1:
172
proc img._.convert.bpp8g_to_bpp1 _src, _dst
177
	mov	eax, [_dst]
173
        mov     eax, [_dst]
178
	mov	eax, [eax + Image.Palette]
174
        mov     eax, [eax + Image.Palette]
179
	mov	dword[eax], 0x00000000
175
        mov     dword[eax], 0x00000000
180
	mov	dword[eax + 4], 0x00ffffff
176
        mov     dword[eax + 4], 0x00ffffff
181
	mov	edx, [ebx + Image.Height]
177
        mov     edx, [ebx + Image.Height]
182
  .bpp8g_to_bpp1.line:
178
  .bpp8g_to_bpp1.line:
183
	mov	ax, 0x0800
179
        mov     ax, 0x0800
184
	mov	ecx, [ebx + Image.Width]
180
        mov     ecx, [ebx + Image.Width]
185
  .bpp8g_to_bpp1.pixel:
181
  .bpp8g_to_bpp1.pixel:
186
	shl	al, 1
182
        shl     al, 1
187
	cmp	byte[esi], 0x7f
183
        cmp     byte[esi], 0x7f
188
	cmc
184
        cmc
189
	adc	eax, 0
185
        adc     eax, 0
190
	add	esi, 1
186
        add     esi, 1
191
	dec	ah
187
        dec     ah
192
	jnz	@f
188
        jnz     @f
193
	mov	byte[edi], al
189
        mov     byte[edi], al
194
	add	edi, 1
190
        add     edi, 1
195
	mov	ax, 0x0800
191
        mov     ax, 0x0800
196
    @@:
192
    @@:
197
	dec	ecx
193
        dec     ecx
198
	jnz	.bpp8g_to_bpp1.pixel
194
        jnz     .bpp8g_to_bpp1.pixel
199
	cmp	ah, 8
195
        cmp     ah, 8
200
	je	@f
196
        je      @f
201
	mov	cl, ah
197
        mov     cl, ah
202
	shl	al, cl
198
        shl     al, cl
203
	mov	byte[edi], al
199
        mov     byte[edi], al
204
	add	edi, 1
-
 
205
    @@:
200
        add     edi, 1
206
	dec	edx
201
    @@:
207
	jnz	.bpp8g_to_bpp1.line
-
 
208
	mov	eax, [_dst]
-
 
209
	jmp	.quit
-
 
210
 
-
 
211
  .bpp8g_to_bpp8g:
-
 
212
	mov	ecx, [ebx + Image.Width]
-
 
213
	imul	ecx, [ebx + Image.Height]
202
        dec     edx
214
	rep	movsb
203
        jnz     .bpp8g_to_bpp1.line
215
	mov	eax, [_dst]
204
        ret
216
	jmp	.quit
205
endp
217
 
206
 
218
  .bpp8g_to_bpp24:
207
proc img._.convert.bpp8g_to_bpp24 _src, _dst
219
	mov	ecx, [ebx + Image.Width]
208
        mov     ecx, [ebx + Image.Width]
220
	imul	ecx, [ebx + Image.Height]
209
        imul    ecx, [ebx + Image.Height]
221
    @@:
210
    @@:
222
	mov	al, byte[esi]
211
        mov     al, byte[esi]
223
	mov	byte[edi + 0], al
212
        mov     byte[edi + 0], al
224
	mov	byte[edi + 1], al
213
        mov     byte[edi + 1], al
225
	mov	byte[edi + 2], al
214
        mov     byte[edi + 2], al
226
	add	esi, 1
215
        add     esi, 1
227
	add	edi, 3
216
        add     edi, 3
228
	sub	ecx, 1
217
        sub     ecx, 1
229
	jnz	@b
218
        jnz     @b
230
	mov	eax, [_dst]
219
        ret
231
	jmp	.quit
-
 
232
 
-
 
233
  .bpp24:
220
endp
234
	mov	edx, img.convert.bpp24.table
221
 
235
	jmp	.find_in_table_and_jump
222
 
236
  .bpp24_to_bpp24:
223
proc img._.convert.bpp24_to_bpp24 _src, _dst
237
	mov	ecx, [ebx + Image.Width]
224
        mov     ecx, [ebx + Image.Width]
238
	imul	ecx, [ebx + Image.Height]
225
        imul    ecx, [ebx + Image.Height]
239
	lea	ecx, [ecx*3]
226
        lea     ecx, [ecx*3]
240
	mov	edx, ecx
227
        mov     edx, ecx
241
	shr	ecx, 2
228
        shr     ecx, 2
242
	rep	movsd
229
        rep     movsd
243
	mov	ecx, edx
230
        mov     ecx, edx
-
 
231
        and     ecx, 3
-
 
232
        rep     movsb
244
	and	ecx, 3
233
        ret
245
	rep	movsb
234
endp
246
	mov	eax, [_dst]
235
 
247
	jmp	.quit
236
 
248
  .bpp24_to_bpp8g:
237
proc img._.convert.bpp24_to_bpp8g _src, _dst
249
	mov	ecx, [ebx + Image.Width]
238
        mov     ecx, [ebx + Image.Width]
250
	imul	ecx, [ebx + Image.Height]
239
        imul    ecx, [ebx + Image.Height]
251
    @@:
240
    @@:
252
	movzx	ebx, byte[esi + 0]
241
        movzx   ebx, byte[esi + 0]
253
	movzx	eax, byte[esi + 1]
242
        movzx   eax, byte[esi + 1]
254
	add	ebx, eax
243
        add     ebx, eax
255
	movzx	eax, byte[esi + 2]
244
        movzx   eax, byte[esi + 2]
256
	add	eax, ebx
245
        add     eax, ebx
257
	mov	ebx, 3
246
        mov     ebx, 3
258
	add	esi, 3
247
        add     esi, 3
259
	div	bl
248
        div     bl
260
	mov	byte[edi], al
249
        mov     byte[edi], al
261
	add	edi, 1
250
        add     edi, 1
-
 
251
        sub     ecx, 1
-
 
252
        jnz     @b
262
	sub	ecx, 1
253
        ret
263
	jnz	@b
254
endp
264
	mov	eax, [_dst]
255
 
265
	jmp	.quit
256
 
266
  .bpp24_to_bpp32:
257
proc img._.convert.bpp24_to_bpp32 _src, _dst
267
	mov	ecx, [ebx + Image.Width]
258
        mov     ecx, [ebx + Image.Width]
268
	imul	ecx, [ebx + Image.Height]
259
        imul    ecx, [ebx + Image.Height]
269
    @@:
260
    @@:
270
        lodsw
261
        lodsw
271
        ror     eax, 16
262
        ror     eax, 16
272
        lodsb
263
        lodsb
-
 
264
        rol     eax, 16
-
 
265
        stosd
-
 
266
        dec     ecx
-
 
267
        jnz     @b
-
 
268
        ret
-
 
269
endp
-
 
270
 
-
 
271
 
273
        rol     eax, 16
272
proc img._.convert.bpp32_to_bpp24 _src, _dst
-
 
273
        mov     ecx, [ebx + Image.Width]
-
 
274
        imul    ecx, [ebx + Image.Height]
-
 
275
    @@:
-
 
276
        mov     eax, [esi]
-
 
277
        mov     [edi], ax
-
 
278
        shr     eax, 16
-
 
279
        mov     [edi + 2], al
-
 
280
        add     esi, 4
-
 
281
        add     edi, 3
-
 
282
        sub     ecx, 1
-
 
283
        jnz     @b
-
 
284
        ret
-
 
285
endp
-
 
286
 
-
 
287
 
274
        stosd
288
proc img._.convert.bpp32_to_bpp32 _src, _dst
-
 
289
        mov     ecx, [ebx + Image.Width]
Line 275... Line -...
275
        dec     ecx
-
 
276
        jnz     @b
-
 
277
	mov	eax, [_dst]
-
 
278
	jmp	.quit
-
 
279
 
-
 
280
 
-
 
281
  .bpp32:
-
 
282
	mov	edx, img.convert.bpp32.table
-
 
283
	jmp	.find_in_table_and_jump
-
 
284
  .bpp32_to_bpp24:
-
 
285
	mov	ecx, [ebx + Image.Width]
-
 
286
	imul	ecx, [ebx + Image.Height]
-
 
287
    @@:
-
 
288
	mov	eax, [esi]
-
 
289
	mov	[edi], ax
-
 
290
	shr	eax, 16
-
 
291
	mov	[edi + 2], al
-
 
292
	add	esi, 4
-
 
293
	add	edi, 3
-
 
294
	sub	ecx, 1
-
 
295
	jnz	@b
290
        imul    ecx, [ebx + Image.Height]
296
	mov	eax, [_dst]
-
 
297
	jmp	.quit
-
 
298
 
291
        rep     movsd
299
 
292
        ret
300
  .bpp15:
293
endp
301
	mov	edx, img.convert.bpp15.table
294
 
302
	jmp	.find_in_table_and_jump
295
 
303
  .bpp15_to_bpp24:
296
proc img._.convert.bpp15_to_bpp24 _src, _dst
304
	mov	ecx, [ebx + Image.Width]
297
        mov     ecx, [ebx + Image.Width]
305
	imul	ecx, [ebx + Image.Height]
298
        imul    ecx, [ebx + Image.Height]
306
 
299
 
307
  .bpp15.intel:	; copypasted from do_rgb
300
  .bpp15.intel: ; copypasted from do_rgb
308
	push	ebx ebp
301
        push    ebx ebp
309
	sub	ecx, 4
302
        sub     ecx, 4
310
	jb	.bpp15.tail
303
        jb      .bpp15.tail
311
align 16
304
align 16
312
  .bpp15.intel.loop:
305
  .bpp15.intel.loop:
313
repeat 2
306
repeat 2
314
	mov	ebx, [esi]
307
        mov     ebx, [esi]
315
	mov	al, [esi]
308
        mov     al, [esi]
316
	mov	ah, [esi + 1]
309
        mov     ah, [esi + 1]
317
	add	esi, 4
310
        add     esi, 4
318
	and	al, 0x1F
311
        and     al, 0x1F
319
	and	ah, 0x1F shl 2
312
        and     ah, 0x1F shl 2
320
	mov	ebp, ebx
313
        mov     ebp, ebx
321
	mov	dl, al
314
        mov     dl, al
322
	mov	dh, ah
315
        mov     dh, ah
323
	shr	al, 2
316
        shr     al, 2
324
	shr	ah, 4
317
        shr     ah, 4
325
	shl	dl, 3
318
        shl     dl, 3
326
	shl	dh, 1
319
        shl     dh, 1
327
	and	ebp, 0x1F shl 5
320
        and     ebp, 0x1F shl 5
328
	add	al, dl
321
        add     al, dl
329
	add	ah, dh
322
        add     ah, dh
330
	shr	ebp, 2
323
        shr     ebp, 2
331
	mov	[edi], al
324
        mov     [edi], al
332
	mov	[edi + 2], ah
325
        mov     [edi + 2], ah
333
	mov	eax, ebx
326
        mov     eax, ebx
334
	mov	ebx, ebp
327
        mov     ebx, ebp
335
	shr	eax, 16
328
        shr     eax, 16
336
	shr	ebx, 5
329
        shr     ebx, 5
337
	add	ebx, ebp
330
        add     ebx, ebp
338
	mov	ebp, eax
331
        mov     ebp, eax
339
	mov	[edi + 1], bl
332
        mov     [edi + 1], bl
340
	and	eax, (0x1F) or (0x1F shl 10)
333
        and     eax, (0x1F) or (0x1F shl 10)
341
	and	ebp, 0x1F shl 5
334
        and     ebp, 0x1F shl 5
342
	lea	edx, [eax + eax]
335
        lea     edx, [eax + eax]
343
	shr	al, 2
336
        shr     al, 2
344
	mov	ebx, ebp
337
        mov     ebx, ebp
345
	shr	ah, 4
338
        shr     ah, 4
346
	shl	dl, 2
339
        shl     dl, 2
347
	shr	ebx, 2
340
        shr     ebx, 2
348
	shr	ebp, 7
341
        shr     ebp, 7
349
	add	al, dl
342
        add     al, dl
350
	add	ah, dh
343
        add     ah, dh
351
	mov	[edi + 3], al
344
        mov     [edi + 3], al
352
	add	ebx, ebp
345
        add     ebx, ebp
353
	mov	[edi + 5], ah
346
        mov     [edi + 5], ah
354
	mov	[edi + 4], bl
347
        mov     [edi + 4], bl
355
	add	edi, 6
348
        add     edi, 6
356
end repeat
349
end repeat
357
	sub	ecx, 4
350
        sub     ecx, 4
358
	jnb	.bpp15.intel.loop
351
        jnb     .bpp15.intel.loop
359
  .bpp15.tail:
352
  .bpp15.tail:
360
	add	ecx, 4
353
        add     ecx, 4
361
	jz	.bpp15.done
354
        jz      .bpp15.done
362
    @@:
355
    @@:
363
	movzx	eax, word [esi]
356
        movzx   eax, word [esi]
364
	mov	ebx, eax
357
        mov     ebx, eax
365
	add	esi, 2
358
        add     esi, 2
366
	and	eax, (0x1F) or (0x1F shl 10)
359
        and     eax, (0x1F) or (0x1F shl 10)
367
	and	ebx, 0x1F shl 5
360
        and     ebx, 0x1F shl 5
368
	lea	edx, [eax + eax]
361
        lea     edx, [eax + eax]
369
	shr	al, 2
362
        shr     al, 2
370
	mov	ebp, ebx
363
        mov     ebp, ebx
371
	shr	ebx, 2
364
        shr     ebx, 2
372
	shr	ah, 4
365
        shr     ah, 4
373
	shl	dl, 2
366
        shl     dl, 2
374
	shr	ebp, 7
367
        shr     ebp, 7
375
	add	eax, edx
368
        add     eax, edx
376
	add	ebx, ebp
369
        add     ebx, ebp
377
	mov	[edi], al
370
        mov     [edi], al
378
	mov	[edi + 1], bl
371
        mov     [edi + 1], bl
379
	mov	[edi + 2], ah
372
        mov     [edi + 2], ah
380
	add	edi, 3
373
        add     edi, 3
Line 381... Line 374...
381
	sub	ecx, 1
374
        sub     ecx, 1
382
	jnz	@b
375
        jnz     @b
383
  .bpp15.done:
376
  .bpp15.done:
384
	pop	ebp ebx
377
        pop     ebp ebx
385
	mov	eax, [_dst]
378
        mov     eax, [_dst]
386
	jmp	.quit
379
        jmp     .quit
387
 
380
 
388
  .bpp15.amd:
381
  .bpp15.amd:
389
	push	ebx ebp
382
        push    ebx ebp
390
	sub	ecx, 4
383
        sub     ecx, 4
391
	jb	.bpp15.tail
384
        jb      .bpp15.tail
392
align 16
385
align 16
393
  .bpp15.amd.loop:
386
  .bpp15.amd.loop:
394
repeat 4
387
repeat 4
395
if (% mod 2) = 1
388
if (% mod 2) = 1
396
	mov	eax, dword[esi]
389
        mov     eax, dword[esi]
397
	mov	ebx, dword[esi]
390
        mov     ebx, dword[esi]
398
else
391
else
399
	movzx	eax, word[esi]
392
        movzx   eax, word[esi]
400
	mov	ebx, eax
393
        mov     ebx, eax
401
end if
394
end if
402
	add	esi, 2
395
        add     esi, 2
403
	and	eax, (0x1F) or (0x1F shl 10)
396
        and     eax, (0x1F) or (0x1F shl 10)
404
	and	ebx, 0x1F shl 5
397
        and     ebx, 0x1F shl 5
405
	lea	edx, [eax + eax]
398
        lea     edx, [eax + eax]
406
	shr	al, 2
399
        shr     al, 2
407
	mov	ebp, ebx
400
        mov     ebp, ebx
408
	shr	ebx, 2
401
        shr     ebx, 2
409
	shr	ah, 4
402
        shr     ah, 4
410
	shl	dl, 2
403
        shl     dl, 2
411
	shr	ebp, 7
404
        shr     ebp, 7
412
	add	eax, edx
405
        add     eax, edx
413
	add	ebx, ebp
406
        add     ebx, ebp
414
	mov	[edi], al
407
        mov     [edi], al
-
 
408
        mov     [edi + 1], bl
-
 
409
        mov     [edi + 2], ah
-
 
410
        add     edi, 3
-
 
411
end repeat
Line 415... Line -...
415
	mov	[edi + 1], bl
-
 
416
	mov	[edi + 2], ah
412
        sub     ecx, 4
417
	add	edi, 3
-
 
418
end repeat
-
 
419
	sub	ecx, 4
413
        jnb     .bpp15.amd.loop
420
	jnb	.bpp15.amd.loop
414
        jmp     .bpp15.tail
421
	jmp	.bpp15.tail
415
 
422
 
416
  .quit:
423
 
417
        ret
424
  .bpp16:
418
endp
425
	mov	edx, img.convert.bpp16.table
419
 
426
	jmp	.find_in_table_and_jump
420
 
427
  .bpp16_to_bpp24:
421
proc img._.convert.bpp16_to_bpp24 _src, _dst
428
	mov	ecx, [ebx + Image.Width]
422
        mov     ecx, [ebx + Image.Width]
429
	imul	ecx, [ebx + Image.Height]
423
        imul    ecx, [ebx + Image.Height]
430
  .bpp16.intel:
424
  .bpp16.intel:
431
	push	ebx ebp
425
        push    ebx ebp
432
	sub	ecx, 4
426
        sub     ecx, 4
433
	jb	.bpp16.tail
427
        jb      .bpp16.tail
434
align 16
428
align 16
435
  .bpp16.intel.loop:
429
  .bpp16.intel.loop:
436
repeat 2
430
repeat 2
437
	mov	ebx, [esi]
431
        mov     ebx, [esi]
438
	mov	al, [esi]
432
        mov     al, [esi]
439
	mov	ah, [esi + 1]
433
        mov     ah, [esi + 1]
440
	add	esi, 4
434
        add     esi, 4
441
	and	al, 0x1F
435
        and     al, 0x1F
442
	and	ah, 0x1F shl 3
436
        and     ah, 0x1F shl 3
443
	mov	ebp, ebx
437
        mov     ebp, ebx
444
	mov	dl, al
438
        mov     dl, al
445
	mov	dh, ah
439
        mov     dh, ah
446
	shr	al, 2
440
        shr     al, 2
447
	shr	ah, 5
441
        shr     ah, 5
448
	shl	dl, 3
442
        shl     dl, 3
449
	and	ebp, 0x3F shl 5
443
        and     ebp, 0x3F shl 5
450
	add	al, dl
444
        add     al, dl
451
	add	ah, dh
445
        add     ah, dh
452
	shr	ebp, 3
446
        shr     ebp, 3
453
	mov	[edi], al
447
        mov     [edi], al
454
	mov	[edi + 2], ah
448
        mov     [edi + 2], ah
455
	mov	eax, ebx
449
        mov     eax, ebx
456
	mov	ebx, ebp
450
        mov     ebx, ebp
457
	shr	eax, 16
451
        shr     eax, 16
458
	shr	ebx, 6
452
        shr     ebx, 6
459
	add	ebx, ebp
453
        add     ebx, ebp
460
	mov	ebp, eax
454
        mov     ebp, eax
461
	mov	[edi + 1], bl
455
        mov     [edi + 1], bl
462
	and	eax, (0x1F) or (0x1F shl 11)
456
        and     eax, (0x1F) or (0x1F shl 11)
463
	and	ebp, 0x3F shl 5
457
        and     ebp, 0x3F shl 5
464
	mov	edx, eax
458
        mov     edx, eax
465
	shr	al, 2
459
        shr     al, 2
466
	mov	ebx, ebp
460
        mov     ebx, ebp
467
	shr	ah, 5
461
        shr     ah, 5
468
	shl	dl, 3
462
        shl     dl, 3
469
	shr	ebx, 3
463
        shr     ebx, 3
470
	shr	ebp, 9
464
        shr     ebp, 9
471
	add	al, dl
465
        add     al, dl
472
	add	ah, dh
466
        add     ah, dh
473
	mov	[edi + 3], al
467
        mov     [edi + 3], al
474
	add	ebx, ebp
468
        add     ebx, ebp
475
	mov	[edi + 5], ah
469
        mov     [edi + 5], ah
476
	mov	[edi + 4], bl
470
        mov     [edi + 4], bl
477
	add	edi, 6
471
        add     edi, 6
478
end repeat
472
end repeat
479
	sub	ecx, 4
473
        sub     ecx, 4
480
	jnb	.bpp16.intel.loop
474
        jnb     .bpp16.intel.loop
481
  .bpp16.tail:
475
  .bpp16.tail:
482
	add	ecx, 4
476
        add     ecx, 4
483
	jz	.bpp16.done
477
        jz      .bpp16.done
484
    @@:
478
    @@:
485
	movzx	eax, word[esi]
479
        movzx   eax, word[esi]
486
	mov	ebx, eax
480
        mov     ebx, eax
487
	add	esi, 2
481
        add     esi, 2
488
	and	eax, (0x1F) or (0x1F shl 11)
482
        and     eax, (0x1F) or (0x1F shl 11)
489
	and	ebx, 0x3F shl 5
483
        and     ebx, 0x3F shl 5
490
	mov	edx, eax
484
        mov     edx, eax
491
	shr	al, 2
485
        shr     al, 2
492
	mov	ebp, ebx
486
        mov     ebp, ebx
493
	shr	ebx, 3
487
        shr     ebx, 3
494
	shr	ah, 5
488
        shr     ah, 5
495
	shl	dl, 3
489
        shl     dl, 3
496
	shr	ebp, 9
490
        shr     ebp, 9
497
	add	eax, edx
491
        add     eax, edx
498
	add	ebx, ebp
492
        add     ebx, ebp
499
	mov	[edi], al
493
        mov     [edi], al
Line 500... Line 494...
500
	mov	[edi + 1], bl
494
        mov     [edi + 1], bl
501
	mov	[edi + 2], ah
495
        mov     [edi + 2], ah
502
	add	edi, 3
496
        add     edi, 3
503
	sub	ecx, 1
497
        sub     ecx, 1
504
	jnz	@b
498
        jnz     @b
505
  .bpp16.done:
499
  .bpp16.done:
506
	pop	ebp ebx
500
        pop     ebp ebx
507
	mov	eax, [_dst]
501
        mov     eax, [_dst]
508
	jmp	.quit
502
        jmp     .quit
509
 
503
 
510
  .bpp16.amd:
504
  .bpp16.amd:
511
	push	ebx ebp
505
        push    ebx ebp
512
	sub	ecx, 4
506
        sub     ecx, 4
513
	jb	.bpp16.tail
507
        jb      .bpp16.tail
514
align 16
508
align 16
515
  .bpp16.amd.loop:
509
  .bpp16.amd.loop:
516
repeat 4
510
repeat 4
517
if (% mod 2) = 1
511
if (% mod 2) = 1
518
	mov	eax, dword[esi]
512
        mov     eax, dword[esi]
519
	mov	ebx, dword[esi]
513
        mov     ebx, dword[esi]
520
else
514
else
521
	movzx	eax, word[esi]
515
        movzx   eax, word[esi]
522
	mov	ebx, eax
516
        mov     ebx, eax
523
end if
517
end if
524
	add	esi, 2
518
        add     esi, 2
525
	and	eax, (0x1F) or (0x1F shl 11)
519
        and     eax, (0x1F) or (0x1F shl 11)
526
	and	ebx, 0x3F shl 5
520
        and     ebx, 0x3F shl 5
527
	mov	edx, eax
521
        mov     edx, eax
528
	shr	al, 2
522
        shr     al, 2
529
	mov	ebp, ebx
523
        mov     ebp, ebx
530
	shr	ebx, 3
524
        shr     ebx, 3
531
	shr	ah, 5
525
        shr     ah, 5
532
	shl	dl, 3
526
        shl     dl, 3
533
	shr	ebp, 9
527
        shr     ebp, 9
Line -... Line 528...
-
 
528
        add     eax, edx
-
 
529
        add     ebx, ebp
-
 
530
        mov     [edi], al
Line 534... Line 531...
534
	add	eax, edx
531
        mov     [edi + 1], bl
535
	add	ebx, ebp
532
        mov     [edi + 2], ah
-
 
533
        add     edi, 3
536
	mov	[edi], al
534
end repeat
537
	mov	[edi + 1], bl
535
        sub     ecx, 4
-
 
536
        jnb     .bpp16.amd.loop
538
	mov	[edi + 2], ah
537
        jmp     .bpp16.tail
539
	add	edi, 3
538
 
540
end repeat
539
  .quit:
541
	sub	ecx, 4
540
        ret
542
	jnb	.bpp16.amd.loop
541
endp
543
	jmp	.bpp16.tail
542
 
544
 
543
 
545
 
544
proc img._.convert.bpp1_to_bpp24 _src, _dst
546
  .bpp1:
545
locals
547
	mov	edx, img.convert.bpp1.table
546
        width   rd 1
548
	jmp	.find_in_table_and_jump
547
        height  rd 1
549
  .bpp1_to_bpp24:
548
endl
550
	push	[ebx + Image.Width]
549
        push    [ebx + Image.Width]
551
	pop	[width]
550
        pop     [width]
552
	push	[ebx + Image.Height]
551
        push    [ebx + Image.Height]
553
	pop	[height]
552
        pop     [height]
554
	mov	edx, [ebx + Image.Palette]
553
        mov     edx, [ebx + Image.Palette]
555
  .bpp1_to_bpp24.line:
554
  .bpp1_to_bpp24.line:
556
	mov	ebx, [width]
555
        mov     ebx, [width]
557
  .bpp1_to_bpp24.byte:
556
  .bpp1_to_bpp24.byte:
558
	mov	ah, 8
557
        mov     ah, 8
559
	mov	al, byte[esi]
558
        mov     al, byte[esi]
560
	add	esi, 1
559
        add     esi, 1
561
  .bpp1_to_bpp24.bit:
560
  .bpp1_to_bpp24.bit:
562
	xor	ecx, ecx
561
        xor     ecx, ecx
563
	shl	al, 1
562
        shl     al, 1
564
	adc	ecx, 0
563
        adc     ecx, 0
565
	mov	ecx, [edx + 4*ecx]
564
        mov     ecx, [edx + 4*ecx]
566
	mov	word[edi], cx
565
        mov     word[edi], cx
567
	shr	ecx, 8
566
        shr     ecx, 8
568
	mov	byte[edi + 2], ch
567
        mov     byte[edi + 2], ch
569
	add	edi, 3
568
        add     edi, 3
Line 570... Line -...
570
	sub	ebx, 1
-
 
571
	jnz	@f
569
        sub     ebx, 1
572
	sub	[height], 1
-
 
573
	jnz	.bpp1_to_bpp24.line
-
 
574
	jmp	.bpp1.done
570
        jnz     @f
575
    @@:
571
        sub     [height], 1
576
	sub	ah, 1
572
        jnz     .bpp1_to_bpp24.line
577
	jnz	.bpp1_to_bpp24.bit
573
        jmp     .bpp1.done
578
	jmp	.bpp1_to_bpp24.byte
574
    @@:
579
  .bpp1.done:
575
        sub     ah, 1
580
	mov	eax, [_dst]
576
        jnz     .bpp1_to_bpp24.bit
581
	jmp	.quit
577
        jmp     .bpp1_to_bpp24.byte
582
 
578
  .bpp1.done:
583
 
579
        ret
584
  .bpp8a:
580
endp
585
	mov	edx, img.convert.bpp8a.table
581
 
586
	jmp	.find_in_table_and_jump
582
 
587
  .bpp8a_to_bpp1:
583
proc img._.convert.bpp8a_to_bpp1 _src, _dst
588
	mov	eax, [_dst]
584
        mov     eax, [_dst]
589
	mov	eax, [eax + Image.Palette]
585
        mov     eax, [eax + Image.Palette]
590
	mov	dword[eax], 0x00000000
586
        mov     dword[eax], 0x00000000
591
	mov	dword[eax + 4], 0x00ffffff
587
        mov     dword[eax + 4], 0x00ffffff
592
	mov	edx, [ebx + Image.Height]
588
        mov     edx, [ebx + Image.Height]
593
  .bpp8a_to_bpp1.line:
589
  .bpp8a_to_bpp1.line:
594
	mov	ax, 0x0800
590
        mov     ax, 0x0800
595
	mov	ecx, [ebx + Image.Width]
591
        mov     ecx, [ebx + Image.Width]
596
  .bpp8a_to_bpp1.pixel:
592
  .bpp8a_to_bpp1.pixel:
597
	shl	al, 1
593
        shl     al, 1
598
	cmp	byte[esi], 0x7f
594
        cmp     byte[esi], 0x7f
599
	cmc
595
        cmc
600
	adc	eax, 0
596
        adc     eax, 0
601
	add	esi, 2
597
        add     esi, 2
602
	dec	ah
598
        dec     ah
603
	jnz	@f
599
        jnz     @f
604
	mov	byte[edi], al
600
        mov     byte[edi], al
605
	add	edi, 1
-
 
606
	mov	ax, 0x0800
-
 
607
    @@:
-
 
608
	dec	ecx
-
 
609
	jnz	.bpp8a_to_bpp1.pixel
-
 
610
	cmp	ah, 8
-
 
611
	je	@f
601
        add     edi, 1
612
	mov	cl, ah
-
 
613
	shl	al, cl
-
 
614
	mov	byte[edi], al
-
 
615
	add	edi, 1
-
 
616
    @@:
-
 
617
	dec	edx
-
 
618
	jnz	.bpp8a_to_bpp1.line
-
 
619
	mov	eax, [_dst]
602
        mov     ax, 0x0800
620
	jmp	.quit
-
 
621
 
-
 
Line -... Line 603...
-
 
603
    @@:
-
 
604
        dec     ecx
-
 
605
        jnz     .bpp8a_to_bpp1.pixel
622
  .bpp8a_to_bpp24:
606
        cmp     ah, 8
623
	mov	ecx, [ebx + Image.Width]
607
        je      @f
-
 
608
        mov     cl, ah
-
 
609
        shl     al, cl
-
 
610
        mov     byte[edi], al
624
	imul	ecx, [ebx + Image.Height]
611
        add     edi, 1
625
    @@:
612
    @@:
-
 
613
        dec     edx
-
 
614
        jnz     .bpp8a_to_bpp1.line
626
	mov	al, byte[esi]
615
        ret
627
	mov	byte[edi + 0], al
616
endp
Line 628... Line 617...
628
	mov	byte[edi + 1], al
617
 
629
	mov	byte[edi + 2], al
618
 
630
	add	esi, 2
-
 
631
	add	edi, 3
-
 
632
	sub	ecx, 1
619
proc img._.convert.bpp8a_to_bpp24 _src, _dst
633
	jnz	@b
620
        mov     ecx, [ebx + Image.Width]
634
	mov	eax, [_dst]
621
        imul    ecx, [ebx + Image.Height]
635
	jmp	.quit
622
    @@:
636
 
623
        mov     al, byte[esi]
637
 
624
        mov     byte[edi + 0], al
-
 
625
        mov     byte[edi + 1], al
638
  .error:
626
        mov     byte[edi + 2], al
639
	xor	eax, eax
627
        add     esi, 2
-
 
628
        add     edi, 3
-
 
629
        sub     ecx, 1
640
  .quit:
630
        jnz     @b
641
        pop     edi esi ebx
631
        ret
-
 
632
endp
642
	ret
633
 
643
endp
634
 
-
 
635
img.convert.bpp8i.table:
644
 
636
        dd Image.bpp24, img._.convert.bpp8i_to_bpp24
645
 
637
        dd Image.bpp32, img._.convert.bpp8i_to_bpp32
-
 
638
        dd 0
-
 
639
img.convert.bpp24.table:
-
 
640
        dd Image.bpp24, img._.convert.bpp24_to_bpp24
-
 
641
        dd Image.bpp8g, img._.convert.bpp24_to_bpp8g
-
 
642
        dd Image.bpp32, img._.convert.bpp24_to_bpp32
-
 
643
        dd 0
-
 
644
img.convert.bpp32.table:
-
 
645
        dd Image.bpp24, img._.convert.bpp32_to_bpp24
-
 
646
        dd Image.bpp32, img._.convert.bpp32_to_bpp32
646
img.convert.bpp8i.table:
647
        dd 0
647
	dd Image.bpp24, img.convert.layer.bpp8i_to_bpp24
648
img.convert.bpp15.table:
-
 
649
        dd Image.bpp24, img._.convert.bpp15_to_bpp24
-
 
650
        dd 0
-
 
651
img.convert.bpp16.table:
-
 
652
        dd Image.bpp24, img._.convert.bpp16_to_bpp24
-
 
653
        dd 0
-
 
654
img.convert.bpp1.table:
-
 
655
        dd Image.bpp24, img._.convert.bpp1_to_bpp24
-
 
656
        dd 0
-
 
657
img.convert.bpp8g.table:
-
 
658
        dd Image.bpp24, img._.convert.bpp8g_to_bpp24
-
 
659
        dd Image.bpp1,  img._.convert.bpp8g_to_bpp1
-
 
660
        dd 0
-
 
661
img.convert.bpp2i.table:
-
 
662
        dd 0