diff options
author | Denise Cheng <dcheng@codeaurora.org> | 2010-10-28 16:34:12 -0400 |
---|---|---|
committer | Steve Kondik <shade@chemlab.org> | 2010-11-03 03:37:04 -0400 |
commit | 89186e13e46776b32b38c7f3fcf01d82d509010a (patch) | |
tree | 98900f1fa68bf34457da656d7240b2922ab51fde | |
parent | d3e8448bb69c29468561432b15679ca38c0d23cf (diff) | |
download | android_external_libpng-froyo-stable.tar.gz android_external_libpng-froyo-stable.tar.bz2 android_external_libpng-froyo-stable.zip |
png: Bug fix for artifact seen in Gallery3D path barfroyo-stablefroyo
Bug is exposed when filter type is avg or paeth, and row width is
equal to bytes per pixel.
Change-Id: I71d7fe89f178c98c2296692ffffd2f8b7ff790ee
-rw-r--r-- | contrib/pngneon/png_read_filter_row_neon.s | 64 |
1 files changed, 56 insertions, 8 deletions
diff --git a/contrib/pngneon/png_read_filter_row_neon.s b/contrib/pngneon/png_read_filter_row_neon.s index d261f71..4d12a68 100644 --- a/contrib/pngneon/png_read_filter_row_neon.s +++ b/contrib/pngneon/png_read_filter_row_neon.s @@ -47,7 +47,7 @@ png_read_filter_row_neon: ldr r12,[sp,#0] - cmp r0,#0 + cmp r12,#0 beq DONE cmp r12,#1 @@ -535,9 +535,6 @@ avg_filter: #;; r3 = previous row pointer #;; r12 = bpp = loop/pointer increment value - cmp r1,r0 - beq DONE - cmp r12,#1 beq avg_filter_1bpp @@ -563,6 +560,9 @@ avg_filter_exit: #;; AVG filter, 1 byte per pixel #;; ---------------------------- avg_filter_1bpp: + + cmp r1,r0 + vld1.8 {d0[0]},[r2] @; load 1 byte (pixel x) from curr @; row into d0[0] vld1.8 {d1[0]},[r3]! @; load 1 byte (pixel b) from prev @@ -573,7 +573,7 @@ avg_filter_1bpp: vst1.8 {d0[0]},[r2]! @; store 1 byte (updated pixel x) @; increment curr row pointer @; updated pixel x is now pixel a - + beq DONE avg_filter_1bpp_loop: add r1,r1,r12 @; loop counter += bpp @@ -597,6 +597,9 @@ avg_filter_1bpp_loop: #;; AVG filter, 2 bytes per pixel #;; ----------------------------- avg_filter_2bpp: + + cmp r1,r0 + vld1.16 {d0[0]},[r2] @; load 2 bytes (pixel x) from curr @; row into d0[0] vld1.16 {d1[0]},[r3]! @; load 2 bytes (pixel b) from prev @@ -607,7 +610,7 @@ avg_filter_2bpp: vst1.16 {d0[0]},[r2]! @; store 2 bytes (updated pixel x) @; increment curr row pointer @; updated pixel x is now pixel a - + beq DONE avg_filter_2bpp_loop: add r1,r1,r12 @; loop counter += bpp @@ -633,6 +636,9 @@ avg_filter_2bpp_loop: #;; AVG filter, 3 bytes per pixel #;; ----------------------------- avg_filter_3bpp: + + cmp r1,r0 + vld1.32 {d0[0]},[r2] @; load 4 bytes (pixel x + 1 extra @; byte) from curr row into d0[0] vld1.32 {d1[0]},[r3],r12 @; load 4 bytes (pixel b + 1 extra @@ -645,6 +651,8 @@ avg_filter_3bpp: vst1.8 {d0[2]},[r2]! @; store 1 byte (updated pixel x) @; increment curr row pointer @; updated pixel x is now pixel a + beq DONE + avg_filter_3bpp_loop: add r1,r1,r12 @; loop counter += bpp cmp r1,r0 @@ -669,6 +677,9 @@ avg_filter_3bpp_loop: #;; AVG filter, 4 bytes per pixel #;; ----------------------------- avg_filter_4bpp: + + cmp r1,r0 + vld1.32 {d0[0]},[r2] @; load 4 bytes (pixel x) from curr @; row into d0[0] vld1.32 {d1[0]},[r3]! @; load 4 bytes (pixel b) from prev @@ -679,6 +690,8 @@ avg_filter_4bpp: vst1.32 {d0[0]},[r2]! @; store 4 bytes (updated pixel x) @; increment curr row pointer @; updated pixel x is now pixel a + beq DONE + avg_filter_4bpp_loop: add r1,r1,r12 @; loop counter += bpp cmp r1,r0 @@ -701,6 +714,9 @@ avg_filter_4bpp_loop: #;; AVG filter, 6 bytes per pixel #;; ----------------------------- avg_filter_6bpp: + + cmp r1,r0 + vld1.8 {d0},[r2] @; load 8 bytes (pixel x + 2 extra @; bytes) from curr row into d0 vld1.8 {d1},[r3],r12 @; load 8 bytes (pixel b + 2 extra @@ -714,6 +730,8 @@ avg_filter_6bpp: vst1.16 {d0[2]},[r2]! @; store 2 bytes (updated pixel x) @; increment curr row pointer @; updated pixel x is now pixel a + beq DONE + avg_filter_6bpp_loop: add r1,r1,r12 @; loop counter += bpp cmp r1,r0 @@ -738,6 +756,9 @@ avg_filter_6bpp_loop: #;; AVG filter, 8 bytes per pixel #;; ----------------------------- avg_filter_8bpp: + + cmp r1,r0 + vld1.8 {d0},[r2] @; load 8 bytes (pixel x) from curr @; row into d0 vld1.8 {d1},[r3]! @; load 8 bytes (pixel b) from prev @@ -748,6 +769,7 @@ avg_filter_8bpp: vst1.8 {d0},[r2]! @; store 8 bytes (updated pixel x) @; increment curr row pointer @; updated pixel x is now pixel a + beq DONE avg_filter_8bpp_loop: add r1,r1,r12 @; loop counter += bpp cmp r1,r0 @@ -782,8 +804,6 @@ paeth_filter: #;; r3 = previous row pointer #;; r12 = bpp = loop/pointer increment value - cmp r1,r0 - beq paeth_filter_DONE cmp r12,#1 beq paeth_filter_1bpp @@ -810,6 +830,9 @@ paeth_filter_exit: #;; PAETH filter, 1 byte per pixel #;; ------------------------------ paeth_filter_1bpp: + + cmp r1, r0 + vld1.8 {d0[0]},[r2] @; load 1 byte (pixel x) from curr @; row into d0[0] vld1.8 {d1[0]},[r3]! @; load 1 byte (pixel b) from prev @@ -819,6 +842,8 @@ paeth_filter_1bpp: vst1.8 {d2[0]},[r2]! @; store 1 byte (updated pixel x) @; increment curr row pointer + beq paeth_filter_DONE + paeth_filter_1bpp_loop: add r1,r1,r12 @; increment curr row pointer cmp r1,r0 @@ -861,6 +886,9 @@ paeth_filter_1bpp_loop: #;; PAETH filter, 2 bytes per pixel #;; ------------------------------- paeth_filter_2bpp: + + cmp r1, r0 + vld1.16 {d0[0]},[r2] @; load 2 bytes (pixel x) from curr @; row into d0[0] vld1.16 {d1[0]},[r3]! @; load 2 bytes (pixel b) from prev @@ -869,6 +897,8 @@ paeth_filter_2bpp: vadd.i8 d2,d0,d1 @; d2 = x + b = updated pixel x vst1.16 {d2[0]},[r2]! @; store 2 bytes (updated pixel x) @; increment curr row pointer + beq paeth_filter_DONE + paeth_filter_2bpp_loop: add r1,r1,r12 @; loop counter += bpp cmp r1,r0 @@ -909,6 +939,9 @@ paeth_filter_2bpp_loop: #;; PAETH filter, 3 bytes per pixel #;; ------------------------------- paeth_filter_3bpp: + + cmp r1, r0 + vld1.32 {d0[0]},[r2] @; load 4 bytes (pixel x + 1 extra @; byte) from curr row into d0[0] vld1.32 {d1[0]},[r3],r12 @; load 4 bytes (pixel b + 1 extra @@ -919,6 +952,8 @@ paeth_filter_3bpp: @; increment curr row pointer vst1.8 {d2[2]},[r2]! @; store 1 byte (updated pixel x) @; increment curr row pointer + beq paeth_filter_DONE + paeth_filter_3bpp_loop: add r1,r1,r12 @; loop counter += bpp cmp r1,r0 @@ -962,6 +997,9 @@ paeth_filter_3bpp_loop: #;; PAETH filter, 4 bytes per pixel #;; ------------------------------- paeth_filter_4bpp: + + cmp r1, r0 + vld1.32 {d0[0]},[r2] @; load 4 bytes (pixel x) from curr @; row into d0[0] vld1.32 {d1[0]},[r3]! @; load 4 bytes (pixel b) from prev @@ -970,6 +1008,8 @@ paeth_filter_4bpp: vadd.i8 d2,d0,d1 @; d2 = x + b = updated pixel x vst1.32 {d2[0]},[r2]! @; store 4 bytes (updated pixel x) @; increment curr row pointer + beq paeth_filter_DONE + paeth_filter_4bpp_loop: add r1,r1,r12 @; loop counter += bpp cmp r1,r0 @@ -1011,6 +1051,8 @@ paeth_filter_4bpp_loop: #;; PAETH filter, 6 bytes per pixel #;; ------------------------------- paeth_filter_6bpp: + cmp r1, r0 + vld1.8 {d0},[r2] @; load 8 bytes (pixel x + 2 extra @; bytes) from curr row into d0 vld1.8 {d1},[r3],r12 @; load 8 bytes (pixel b + 2 extra @@ -1021,6 +1063,8 @@ paeth_filter_6bpp: @; increment curr row pointer vst1.16 {d2[2]},[r2]! @; store 2 bytes (updated pixel x) @; increment curr row pointer + beq paeth_filter_DONE + paeth_filter_6bpp_loop: add r1,r1,r12 @; loop counter += bpp cmp r1,r0 @@ -1064,6 +1108,8 @@ paeth_filter_6bpp_loop: #;; PAETH filter, 8 bytes per pixel #;; ------------------------------- paeth_filter_8bpp: + cmp r1, r0 + vld1.8 {d0},[r2] @; load 8 bytes (pixel x) from curr @; row into d0 vld1.8 {d1},[r3]! @; load 8 bytes (pixel b) from prev @@ -1072,6 +1118,8 @@ paeth_filter_8bpp: vadd.i8 d2,d0,d1 @; d2 = x + b = updated pixel x vst1.8 {d2},[r2]! @; store 8 bytes (updated pixel x) @; increment curr row pointer + beq paeth_filter_DONE + paeth_filter_8bpp_loop: add r1,r1,r12 @; loop counter += bpp cmp r1,r0 |