Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1079 diamond 1
;;================================================================================================;;
3055 dunkaist 2
;;//// tga.asm //// (c) Nable, 2007-2008, (c) dunkaist, 2012 /////////////////////////////////////;;
1079 diamond 3
;;================================================================================================;;
4
;;                                                                                                ;;
5
;; This file is part of Common development libraries (Libs-Dev).                                  ;;
6
;;                                                                                                ;;
7
;; Libs-Dev is free software: you can redistribute it and/or modify it under the terms of the GNU ;;
8
;; Lesser General Public License as published by the Free Software Foundation, either version 2.1 ;;
9
;; of the License, or (at your option) any later version.                                         ;;
10
;;                                                                                                ;;
11
;; Libs-Dev is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without  ;;
12
;; even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU  ;;
13
;; Lesser General Public License for more details.                                                ;;
14
;;                                                                                                ;;
15
;; You should have received a copy of the GNU Lesser General Public License along with Libs-Dev.  ;;
16
;; If not, see .                                                    ;;
17
;;                                                                                                ;;
18
;;================================================================================================;;
19
;;                                                                                                ;;
20
;; References:                                                                                    ;;
21
;;   1. Hiview 1.2 by Mohammad A. REZAEI                                                          ;;
3055 dunkaist 22
;;   2. Truevision TGA FILE FORMAT SPECIFICATION Version 2.0                                      ;;
23
;;      Technical Manual Version 2.2 January, 1991                                                ;;
1079 diamond 24
;;                                                                                                ;;
25
;;================================================================================================;;
26
 
27
include 'tga.inc'
28
 
29
;;================================================================================================;;
30
proc img.is.tga _data, _length ;//////////////////////////////////////////////////////////////////;;
31
;;------------------------------------------------------------------------------------------------;;
32
;? Determine if raw data could be decoded (is in Targa format)                                    ;;
33
;;------------------------------------------------------------------------------------------------;;
34
;> _data = raw data as read from file/stream                                                      ;;
35
;> _length = data length                                                                          ;;
36
;;------------------------------------------------------------------------------------------------;;
37
;< eax = false / true                                                                             ;;
38
;;================================================================================================;;
3055 dunkaist 39
	push	ebx
1079 diamond 40
	cmp	[_length], 18
41
	jbe	.nope
3055 dunkaist 42
	mov	ebx, [_data]
43
	mov	eax, dword[ebx + tga_header.colormap_type]
44
	cmp	al, 1
1079 diamond 45
	ja	.nope
3055 dunkaist 46
	cmp	ah, 11
1079 diamond 47
	ja	.nope
3055 dunkaist 48
	cmp	ah, 9
1079 diamond 49
	jae	.cont1
3055 dunkaist 50
	cmp	ah, 3
1079 diamond 51
	ja	.nope
3055 dunkaist 52
  .cont1:
53
	mov	eax, dword[ebx + tga_header.image_spec.depth]
54
	test	eax, 111b	; bpp must be 8, 15, 16, 24 or 32
1079 diamond 55
	jnz	.maybe15
3055 dunkaist 56
	shr	al, 3
57
	cmp	al, 4
1079 diamond 58
	ja	.nope
59
	jmp	.cont2
3055 dunkaist 60
  .maybe15:
61
	cmp	al, 15
1079 diamond 62
	jne	.nope
3055 dunkaist 63
  .cont2: 			; continue testing
64
	movzx	eax, byte[ebx + tga_header.colormap_spec.entry_size]	; palette bpp
65
	cmp	eax, 0
1079 diamond 66
	je	.yep
3055 dunkaist 67
	cmp	eax, 16
1079 diamond 68
	je	.yep
3055 dunkaist 69
	cmp	eax, 24
70
	je	.yep
71
	cmp	eax, 32
72
	je	.yep
73
  .nope:
1079 diamond 74
	xor	eax, eax
3055 dunkaist 75
	pop	ebx
1079 diamond 76
	ret
77
 
3055 dunkaist 78
  .yep:
1079 diamond 79
	xor	eax, eax
80
	inc	eax
3055 dunkaist 81
	pop	ebx
1079 diamond 82
	ret
83
endp
84
 
85
;;================================================================================================;;
1102 diamond 86
proc img.decode.tga _data, _length, _options ;////////////////////////////////////////////////////;;
1079 diamond 87
;;------------------------------------------------------------------------------------------------;;
88
;? Decode data into image if it contains correctly formed raw data in Targa format                ;;
89
;;------------------------------------------------------------------------------------------------;;
90
;> _data = raw data as read from file/stream                                                      ;;
91
;> _length = data length                                                                          ;;
92
;;------------------------------------------------------------------------------------------------;;
93
;< eax = 0 (error) or pointer to image                                                            ;;
94
;;================================================================================================;;
95
locals
3055 dunkaist 96
	width		dd ?
97
	height		dd ?
98
	bytes_per_pixel	dd ?
99
	retvalue	dd ?
1079 diamond 100
endl
3055 dunkaist 101
	push	ebx esi edi
102
	mov	ebx, [_data]
103
	movzx	esi, byte[ebx]
104
	lea	esi, [esi + ebx + sizeof.tga_header]	; skip comment and header
105
	mov	edx, dword[ebx + tga_header.image_spec.width]
106
	movzx	ecx, dx			; ecx = width
107
	shr	edx, 16			; edx = height
108
	mov	[width], ecx
109
	mov	[height], edx
110
	movzx	eax, byte[ebx + tga_header.image_spec.depth]
111
	add	eax, 7
112
	shr	eax, 3
113
	mov	[bytes_per_pixel], eax
114
	movzx	eax, byte[ebx + tga_header.image_spec.depth]
115
 
116
	cmp	eax, 8
117
	jne	@f
118
	mov	eax, Image.bpp8i
119
	jmp	.type_defined
120
    @@:
121
	cmp	eax, 15
122
	jne	@f
123
	mov	eax, Image.bpp15
124
	jmp	.type_defined
125
    @@:
126
	cmp	eax, 16
127
	jne	@f
128
	mov	eax, Image.bpp15	; 16bpp tga images are really 15bpp ARGB
129
	jmp	.type_defined
130
    @@:
131
	cmp	eax, 24
132
	jne	@f
133
	mov	eax, Image.bpp24
134
	jmp	.type_defined
135
    @@:
136
	cmp	eax, 32
137
	jne	@f
138
	mov	eax, Image.bpp32
139
	jmp	.type_defined
140
    @@:
141
  .type_defined:
142
	stdcall	img.create, ecx, edx, eax
143
	mov	[retvalue], eax
144
	test	eax, eax		; failed to allocate?
145
	jz	.done			; then exit
146
	mov	ebx, eax
147
	cmp	dword[ebx + Image.Type], Image.bpp8i
1079 diamond 148
	jne	.palette_parsed
3055 dunkaist 149
	mov	edi, [ebx + Image.Palette]
150
	mov	ecx, [_data]
151
	cmp	byte[ecx + tga_header.image_type], 3	; we also have grayscale subtype
152
	jz	.write_grayscale_palette		; that don't hold palette in file
153
	cmp	byte[ecx + tga_header.image_type], 11
1079 diamond 154
	jz	.write_grayscale_palette
3055 dunkaist 155
	movzx	eax, byte[ecx + tga_header.colormap_spec.entry_size]	; size of colormap entries in bits
156
	movzx	ecx, word[ecx + tga_header.colormap_spec.colormap_length]	; number of colormap entries
157
	cmp	eax, 24
158
	je	.24bpp_palette
159
	cmp	eax, 16
160
	je	.16bpp_palette
161
	rep	movsd			; else they are 32 bpp
1079 diamond 162
	jmp	.palette_parsed
3055 dunkaist 163
  .write_grayscale_palette:
164
	mov	ecx, 0x100
165
	xor	eax, eax
166
    @@:
1079 diamond 167
	stosd
3055 dunkaist 168
	add	eax, 0x010101
169
	loop	@b
1079 diamond 170
	jmp	.palette_parsed
3055 dunkaist 171
  .16bpp_palette:			; FIXME: code copypasted from img.do_rgb, should use img.convert
172
	push	ebx edx ebp
173
    @@:
174
	movzx	eax, word[esi]
175
	mov	ebx, eax
176
	add	esi, 2
177
	and	eax, (0x1F) or (0x1F shl 10)
178
	and	ebx, 0x1F shl 5
179
	lea	edx, [eax + eax]
180
	shr	al, 2
181
	mov	ebp, ebx
182
	shr	ebx, 2
183
	shr	ah, 4
184
	shl	dl, 2
185
	shr	ebp, 7
186
	add	eax, edx
187
	add	ebx, ebp
188
	mov	[edi], al
189
	mov	[edi + 1], bl
190
	mov	[edi + 2], ah
191
	add	edi, 4
192
	loop	@b
193
	pop	ebp edx ebx
194
	jmp	.palette_parsed
195
 
196
  .24bpp_palette:
197
    @@:
1079 diamond 198
	lodsd
3055 dunkaist 199
	dec	esi
200
	and	eax, 0xffffff
1079 diamond 201
	stosd
3055 dunkaist 202
	loop	@b
203
  .palette_parsed:
204
	mov	edi, [ebx + Image.Data]
205
	mov	ebx, [width]
206
	imul	ebx, [height]
207
	mov	edx, [bytes_per_pixel]
208
	mov	eax, [_data]
209
	test	byte[eax + tga_header.image_type], 0x08
210
	jz	.uncompressed
211
  .next_rle_packet:
212
	xor	eax, eax
213
	lodsb
214
	btr	ax, 7			; Run-length packet?
215
	jnc	.raw_packet
216
	add	eax, 1
217
	sub	ebx, eax
218
    @@:
219
	mov	ecx, edx
220
	rep	movsb
221
	sub	esi, edx
222
	sub	eax, 1
223
	jnz	@b
224
	add	esi, edx
225
	test	ebx, ebx
226
	jnz	.next_rle_packet
227
	jmp	.done
228
  .raw_packet:
229
	mov	ecx, eax
230
	add	ecx, 1
231
	sub	ebx, ecx
232
	imul	ecx, edx
233
	rep	movsb
234
	test	ebx, ebx
235
	jnz	.next_rle_packet
236
  .uncompressed:
237
	imul	edx, ebx
238
	mov	ecx, edx
239
	rep	movsb
240
  .done:
241
	xor	ebx, ebx
242
	mov	esi, [_data]
243
	test	byte[esi + tga_header.image_spec.descriptor], TGA_START_TOP
244
	jnz	@f
245
	or	ebx, FLIP_VERTICAL
246
    @@:
247
	test	byte[esi + tga_header.image_spec.descriptor], TGA_START_RIGHT
248
	jz	@f
249
	or	ebx, FLIP_HORIZONTAL
250
    @@:
251
	test	ebx, ebx
252
	jz	@f
253
	stdcall	img.flip, [retvalue], ebx
254
    @@:
255
	pop	edi esi ebx
256
	mov	eax, [retvalue]
1079 diamond 257
	ret
258
endp
259
 
260
;;================================================================================================;;
1102 diamond 261
proc img.encode.tga _img, _p_length, _options ;///////////////////////////////////////////////////;;
1079 diamond 262
;;------------------------------------------------------------------------------------------------;;
263
;? Encode image into raw data in Targa format                                                     ;;
264
;;------------------------------------------------------------------------------------------------;;
265
;> _img = pointer to image                                                                        ;;
266
;;------------------------------------------------------------------------------------------------;;
267
;< eax = 0 (error) or pointer to encoded data                                                     ;;
268
;< _p_length = encoded data length                                                                ;;
269
;;================================================================================================;;
270
	xor	eax, eax
271
	ret
272
endp
273
 
274
;;================================================================================================;;
275
;;////////////////////////////////////////////////////////////////////////////////////////////////;;
276
;;================================================================================================;;
277
;! Below are private procs you should never call directly from your code                          ;;
278
;;================================================================================================;;
279
;;////////////////////////////////////////////////////////////////////////////////////////////////;;
280
;;================================================================================================;;
281
 
282
;;================================================================================================;;
283
;;////////////////////////////////////////////////////////////////////////////////////////////////;;
284
;;================================================================================================;;
285
;! Below is private data you should never use directly from your code                             ;;
286
;;================================================================================================;;
287
;;////////////////////////////////////////////////////////////////////////////////////////////////;;
288
;;================================================================================================;;