Subversion Repositories Kolibri OS

Rev

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

Rev 6883 Rev 6888
Line 2940... Line 2940...
2940
 
2940
 
Line 2941... Line 2941...
2941
;png_size_t (png_structrp png_ptr, const uint_32 bpp,
2941
;png_size_t (png_structrp png_ptr, const uint_32 bpp,
2942
;    const png_size_t row_bytes, const png_size_t lmins)
2942
;    const png_size_t row_bytes, const png_size_t lmins)
2943
align 4
2943
align 4
2944
proc png_setup_paeth_row, png_ptr:dword, bpp:dword, row_bytes:dword, lmins:dword
2944
proc png_setup_paeth_row uses ebx ecx edx edi esi, png_ptr:dword, bpp:dword, row_bytes:dword, lmins:dword
2945
;   bytep rp, dp, pp, cp, lp;
2945
locals
2946
;   png_size_t i;
2946
	pp dd ?
2947
;   png_size_t sum = 0;
2947
	sum dd ?
2948
;   int v;
2948
	v dd ?
2949
 
-
 
2950
;   png_ptr->try_row[0] = PNG_FILTER_VALUE_PAETH;
-
 
2951
 
-
 
2952
;   for (i = 0, rp = png_ptr->row_buf + 1, dp = png_ptr->try_row + 1,
-
 
2953
;       pp = png_ptr->prev_row + 1; i < bpp; i++)
-
 
2954
;   {
2949
	lp dd ?
2955
;      v = *dp++ = (byte)(((int)*rp++ - (int)*pp++) & 0xff);
-
 
2956
 
-
 
2957
if PNG_USE_ABS eq 1
2950
	cp dd ?
2958
;      sum += 128 - abs(v - 128);
-
 
2959
else
2951
	a dd ?
2960
;      sum += (v < 128) ? v : 256 - v;
-
 
2961
end if
2952
	b dd ?
2962
;   }
2953
	c dd ?
2963
 
2954
	p dd ?
2964
;   for (lp = png_ptr->row_buf + 1, cp = png_ptr->prev_row + 1; i < row_bytes;
-
 
2965
;        i++)
2955
	pa dd ?
2966
;   {
2956
	pb dd ?
2967
;      int a, b, c, pa, pb, pc, p;
2957
	pc dd ?
2968
 
2958
endl
2969
;      b = *pp++;
2959
	;ecx - i
2970
;      c = *cp++;
2960
	;edi - dp
2971
;      a = *lp++;
2961
	;esi - rp
2972
 
-
 
2973
;      p = b - c;
2962
	mov dword[sum],0
2974
;      pc = a - c;
2963
	mov ebx,[png_ptr]
2975
 
-
 
2976
if PNG_USE_ABS eq 1
2964
	mov eax,[ebx+png_struct.try_row]
2977
;      pa = abs(p);
2965
	mov byte[eax],PNG_FILTER_VALUE_PAETH
2978
;      pb = abs(pc);
2966
	xor ecx,ecx
2979
;      pc = abs(p + pc);
2967
	mov esi,[ebx+png_struct.row_buf]
2980
else
2968
	inc esi
2981
;      pa = p < 0 ? -p : p;
2969
	mov edi,[ebx+png_struct.try_row]
2982
;      pb = pc < 0 ? -pc : pc;
2970
	inc edi
2983
;      pc = (p + pc) < 0 ? -(p + pc) : p + pc;
2971
	mov eax,[ebx+png_struct.prev_row]
2984
end if
2972
	inc eax
2985
 
-
 
2986
;      p = (pa <= pb && pa <=pc) ? a : (pb <= pc) ? b : c;
2973
	mov [pp],eax
2987
 
2974
	jmp @f
2988
;      v = *dp++ = (byte)(((int)*rp++ - p) & 0xff);
-
 
Line -... Line 2975...
-
 
2975
 
-
 
2976
align 4
-
 
2977
.cycle0:
-
 
2978
	inc ecx
2989
 
2979
	@@:
2990
if PNG_USE_ABS eq 1
2980
	cmp ecx,[bpp]
2991
;      sum += 128 - abs(v - 128);
2981
	jae .cycle0end
-
 
2982
	lodsb
2992
else
2983
	mov edx,[pp]
-
 
2984
	movzx edx,byte[edx]
-
 
2985
	sub al,dl
-
 
2986
	stosb
-
 
2987
	and eax,0xff
-
 
2988
	mov [v],eax
-
 
2989
	inc dword[pp]
2993
;      sum += (v < 128) ? v : 256 - v;
2990
	cmp eax,0x80
-
 
2991
	jge @f
-
 
2992
		add [sum],eax
-
 
2993
		jmp .cycle0
-
 
2994
	@@:
-
 
2995
	mov eax,0x100
-
 
2996
	sub eax,[v]
-
 
2997
	add [sum],eax
-
 
2998
	jmp .cycle0
Line 2994... Line 2999...
2994
end if
2999
.cycle0end:
-
 
3000
 
2995
 
3001
	mov eax,[ebx+png_struct.row_buf]
-
 
3002
	inc eax
-
 
3003
	mov [lp],eax
-
 
3004
	mov eax,[ebx+png_struct.prev_row]
2996
;      if (sum > lmins)  /* We are already worse, don't continue. */
3005
	inc eax
Line -... Line 3006...
-
 
3006
	mov [cp],eax
-
 
3007
	jmp @f
-
 
3008
 
-
 
3009
align 4
-
 
3010
.cycle1:
-
 
3011
	inc ecx
-
 
3012
	@@:
-
 
3013
	cmp ecx,[row_bytes]
-
 
3014
	jae .cycle1end
-
 
3015
	mov eax,[pp]
-
 
3016
	movzx ebx,byte[eax]
-
 
3017
	mov [b],ebx
-
 
3018
	inc dword[pp]
-
 
3019
	mov eax,[cp]
-
 
3020
	movzx ebx,byte[eax]
-
 
3021
	mov [c],ebx
-
 
3022
	inc dword[cp]
-
 
3023
	mov eax,[lp]
-
 
3024
	movzx ebx,byte[eax]
-
 
3025
	mov [a],ebx
-
 
3026
	inc dword[lp]
-
 
3027
	mov eax,[b]
-
 
3028
	sub eax,[c]
-
 
3029
	mov [p],eax
-
 
3030
	mov ebx,[a]
-
 
3031
	sub ebx,[c]
-
 
3032
	mov [pc],ebx
-
 
3033
	mov eax,[p]
-
 
3034
	cmp eax,0
-
 
3035
	jge @f
-
 
3036
		neg eax
-
 
3037
	@@:
-
 
3038
	mov [pa],eax
-
 
3039
	mov eax,[pc]
-
 
3040
	cmp eax,0
-
 
3041
	jge @f
-
 
3042
		neg eax
-
 
3043
	@@:
-
 
3044
	mov [pb],eax
-
 
3045
	mov eax,[p]
-
 
3046
	add eax,[pc]
-
 
3047
	jns @f
-
 
3048
		neg eax
-
 
3049
	@@:
-
 
3050
	mov [pc],eax
-
 
3051
	mov eax,[pa]
-
 
3052
	cmp eax,[pb]
-
 
3053
	jg .end0
-
 
3054
	cmp eax,[pc]
-
 
3055
	jg .end0
-
 
3056
		mov eax,[a]
-
 
3057
		jmp .end1
-
 
3058
	.end0:
-
 
3059
		mov eax,[pb]
-
 
3060
		cmp eax,[pc]
-
 
3061
		jg .end2
-
 
3062
			mov eax,[b]
-
 
3063
			jmp .end1
-
 
3064
		.end2:
-
 
3065
			mov eax,[c]
-
 
3066
	.end1:
-
 
3067
	mov [p],eax
-
 
3068
	movzx eax,byte[esi]
-
 
3069
	sub eax,[p]
-
 
3070
	and eax,0xff
-
 
3071
	stosb
-
 
3072
	mov [v],eax
-
 
3073
	inc esi
-
 
3074
	cmp dword[v],0x80
-
 
3075
	jge .end3
-
 
3076
		mov eax,[v]
-
 
3077
		add [sum],eax
-
 
3078
		jmp .end4
-
 
3079
	.end3:
-
 
3080
		mov eax,0x100
-
 
3081
		sub eax,[v]
-
 
3082
		add [sum],eax
-
 
3083
	.end4:
-
 
3084
	mov eax,[sum]
2997
;        break;
3085
	cmp eax,[lmins] ;We are already worse, don't continue.
2998
;   }
3086
	jbe .cycle1
2999
 
3087
.cycle1end:
Line 3000... Line 3088...
3000
;   return (sum);
3088
	mov eax,[sum]
3001
	ret
3089
	ret
3002
endp
3090
endp
-
 
3091
 
3003
 
3092
;void (png_structrp png_ptr, const uint_32 bpp, const png_size_t row_bytes)
3004
;void (png_structrp png_ptr, const uint_32 bpp, const png_size_t row_bytes)
3093
align 4
3005
align 4
3094
proc png_setup_paeth_row_only, png_ptr:dword, bpp:dword, row_bytes:dword
3006
proc png_setup_paeth_row_only, png_ptr:dword, bpp:dword, row_bytes:dword
-
 
3007
;   bytep rp, dp, pp, cp, lp;
3095
locals
3008
;   png_size_t i;
-
 
3009
 
-
 
3010
;   png_ptr->try_row[0] = PNG_FILTER_VALUE_PAETH;
3096
	pp dd ?
3011
 
-
 
3012
;   for (i = 0, rp = png_ptr->row_buf + 1, dp = png_ptr->try_row + 1,
3097
	lp dd ?
3013
;       pp = png_ptr->prev_row + 1; i < bpp; i++)
3098
	cp dd ?
3014
;   {
-
 
3015
;      *dp++ = (byte)(((int)*rp++ - (int)*pp++) & 0xff);
3099
	a dd ?
3016
;   }
3100
	b dd ?
3017
 
3101
	c dd ?
3018
;   for (lp = png_ptr->row_buf + 1, cp = png_ptr->prev_row + 1; i < row_bytes;
3102
	p dd ?
-
 
3103
	pa dd ?
-
 
3104
	pb dd ?
3019
;        i++)
3105
	pc dd ?
3020
;   {
3106
endl
3021
;      int a, b, c, pa, pb, pc, p;
3107
pushad
3022
 
-
 
-
 
3108
	;ecx - i
3023
;      b = *pp++;
3109
	;edi - dp
3024
;      c = *cp++;
3110
	;esi - rp
3025
;      a = *lp++;
-
 
3026
 
3111
	mov eax,[png_ptr]
-
 
3112
	mov ebx,[eax+png_struct.try_row]
-
 
3113
	mov byte[ebx],4
3027
;      p = b - c;
3114
	xor ecx,ecx
3028
;      pc = a - c;
3115
	mov edx,[png_ptr]
3029
 
3116
	mov eax,[edx+png_struct.row_buf]
3030
if PNG_USE_ABS eq 1
3117
	inc eax
-
 
3118
	mov esi,eax
3031
;      pa = abs(p);
3119
	mov ebx,[png_ptr]
3032
;      pb = abs(pc);
3120
	mov edx,[ebx+png_struct.try_row]
-
 
3121
	inc edx
3033
;      pc = abs(p + pc);
3122
	mov edi,edx
3034
else
3123
	mov eax,[png_ptr]
Line -... Line 3124...
-
 
3124
	mov ebx,[eax+png_struct.prev_row]
-
 
3125
	inc ebx
-
 
3126
	mov [pp],ebx
-
 
3127
	jmp @f
-
 
3128
 
-
 
3129
align 4
-
 
3130
.cycle0:
-
 
3131
	inc ecx
-
 
3132
	@@:
-
 
3133
	cmp ecx,[bpp]
-
 
3134
	jae .cycle0end
-
 
3135
	lodsb
-
 
3136
	mov ebx,[pp]
-
 
3137
	movzx ebx,byte[ebx]
-
 
3138
	sub al,bl
-
 
3139
	stosb
3035
;      pa = p < 0 ? -p : p;
3140
	inc dword[pp]
-
 
3141
	jmp .cycle0
-
 
3142
.cycle0end:
-
 
3143
 
-
 
3144
	mov eax,[png_ptr]
-
 
3145
	mov ebx,[eax+png_struct.row_buf]
-
 
3146
	inc ebx
-
 
3147
	mov [lp],ebx
Line -... Line 3148...
-
 
3148
	mov edx,[png_ptr]
-
 
3149
	mov eax,[edx+png_struct.prev_row]
-
 
3150
	inc eax
-
 
3151
	mov [cp],eax
-
 
3152
	jmp @f
-
 
3153
 
-
 
3154
align 4
-
 
3155
.cycle1:
-
 
3156
	inc ecx
-
 
3157
	@@:
-
 
3158
	cmp ecx,[row_bytes]
-
 
3159
	jae .cycle1end
-
 
3160
	mov eax,[pp]
-
 
3161
	movzx ebx,byte[eax]
-
 
3162
	mov [b],ebx
-
 
3163
	inc dword[pp]
-
 
3164
	mov eax,[cp]
-
 
3165
	movzx ebx,byte[eax]
-
 
3166
	mov [c],ebx
-
 
3167
	inc dword[cp]
-
 
3168
	mov eax,[lp]
-
 
3169
	movzx ebx,byte[eax]
-
 
3170
	mov [a],ebx
-
 
3171
	inc dword[lp]
-
 
3172
	mov eax,[b]
-
 
3173
	sub eax,[c]
-
 
3174
	mov [p],eax
-
 
3175
	mov ebx,[a]
-
 
3176
	sub ebx,[c]
-
 
3177
	mov [pc],ebx
-
 
3178
	mov eax,[p]
-
 
3179
	cmp eax,0
-
 
3180
	jge @f
-
 
3181
		neg eax
-
 
3182
	@@:
-
 
3183
	mov [pa],eax
-
 
3184
	mov eax,[pc]
-
 
3185
	cmp eax,0
-
 
3186
	jge @f
-
 
3187
		neg eax
-
 
3188
	@@:
-
 
3189
	mov [pb],eax
-
 
3190
	mov eax,[p]
-
 
3191
	add eax,[pc]
-
 
3192
	jns @f
-
 
3193
		neg eax
-
 
3194
	@@:
-
 
3195
	mov [pc],eax
-
 
3196
	mov eax,[pa]
-
 
3197
	cmp eax,[pb]
-
 
3198
	jg .end0
-
 
3199
	cmp eax,[pc]
-
 
3200
	jg .end0
-
 
3201
		mov eax,[a]
-
 
3202
		jmp .end1
-
 
3203
	.end0:
-
 
3204
		mov eax,[pb]
-
 
3205
		cmp eax,[pc]
-
 
3206
		jg .end2
3036
;      pb = pc < 0 ? -pc : pc;
3207
			mov eax,[b]
-
 
3208
			jmp .end1
-
 
3209
		.end2:
-
 
3210
			mov eax,[c]
-
 
3211
	.end1:
-
 
3212
	mov [p],eax
-
 
3213
	movzx eax,byte[esi]
3037
;      pc = (p + pc) < 0 ? -(p + pc) : p + pc;
3214
	sub eax,[p]
3038
end if
3215
	and eax,0xff
3039
 
3216
	stosb
Line 3040... Line 3217...
3040
;      p = (pa <= pb && pa <=pc) ? a : (pb <= pc) ? b : c;
3217
	inc esi
3041
 
3218
	jmp .cycle1
Line 3219... Line 3396...
3219
				mov [edi+png_struct.try_row],eax
3396
				mov [edi+png_struct.try_row],eax
3220
				mov eax,[best_row]
3397
				mov eax,[best_row]
3221
				mov [edi+png_struct.tst_row],eax
3398
				mov [edi+png_struct.tst_row],eax
3222
	.end3:
3399
	.end3:
3223
if 0 ;;; tmp
3400
 
3224
	; Paeth filter
3401
	; Paeth filter
3225
	mov eax,[filter_to_do]
3402
	mov eax,[filter_to_do]
3226
	cmp eax,PNG_FILTER_PAETH
3403
	cmp eax,PNG_FILTER_PAETH
3227
	jne @f ;if (..==..)
3404
	jne @f ;if (..==..)
3228
		; It's the only filter so no testing is needed
3405
		; It's the only filter so no testing is needed
3229
		stdcall png_setup_paeth_row_only, edi, [bpp], [row_bytes]
3406
		stdcall png_setup_paeth_row_only, edi, [bpp], [row_bytes]
Line 3245... Line 3422...
3245
				mov [edi+png_struct.try_row],eax
3422
				mov [edi+png_struct.try_row],eax
3246
				mov eax,[best_row]
3423
				mov eax,[best_row]
3247
				mov [edi+png_struct.tst_row],eax
3424
				mov [edi+png_struct.tst_row],eax
3248
	.end4:
3425
	.end4:
3249
end if
3426
 
3250
	; Do the actual writing of the filtered row data from the chosen filter.
3427
	; Do the actual writing of the filtered row data from the chosen filter.
3251
	mov eax,[esi+png_row_info.rowbytes]
3428
	mov eax,[esi+png_row_info.rowbytes]
3252
	inc eax
3429
	inc eax
3253
	stdcall png_write_filtered_row, edi, [best_row], eax
3430
	stdcall png_write_filtered_row, edi, [best_row], eax
3254
end if ;WRITE_FILTER
3431
end if ;WRITE_FILTER
3255
popad
3432
popad