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 |