sparse_array: optimizations for lossy case
authorEven Rouault <even.rouault@spatialys.com>
Fri, 1 Sep 2017 14:31:10 +0000 (16:31 +0200)
committerEven Rouault <even.rouault@spatialys.com>
Fri, 1 Sep 2017 20:23:29 +0000 (22:23 +0200)
src/lib/openjp2/sparse_array.c

index 48c4b23b0ca0c0c417bdf4259d231d00cbe98665..40459bdb922808b2a0b53ac83f3d3448c2111723 100644 (file)
@@ -200,6 +200,21 @@ static OPJ_BOOL opj_sparse_array_int32_read_or_write(
                             for (; k < x_incr; k++) {
                                 dest_ptr[k * buf_col_stride] = src_ptr[k];
                             }
+                        } else if (x_incr >= 8 && buf_col_stride == 8) {
+                            for (j = 0; j < y_incr; j++) {
+                                OPJ_UINT32 k;
+                                for (k = 0; k < (x_incr & ~3U); k += 4) {
+                                    dest_ptr[k * buf_col_stride] = src_ptr[k];
+                                    dest_ptr[(k + 1) * buf_col_stride] = src_ptr[k + 1];
+                                    dest_ptr[(k + 2) * buf_col_stride] = src_ptr[k + 2];
+                                    dest_ptr[(k + 3) * buf_col_stride] = src_ptr[k + 3];
+                                }
+                                for (; k < x_incr; k++) {
+                                    dest_ptr[k * buf_col_stride] = src_ptr[k];
+                                }
+                                dest_ptr += buf_line_stride;
+                                src_ptr += block_width;
+                            }
                         } else {
                             /* General case */
                             for (j = 0; j < y_incr; j++) {
@@ -254,6 +269,21 @@ static OPJ_BOOL opj_sparse_array_int32_read_or_write(
                             src_ptr += buf_line_stride;
                             dest_ptr += block_width;
                         }
+                    } else if (x_incr >= 8 && buf_col_stride == 8) {
+                        for (j = 0; j < y_incr; j++) {
+                            OPJ_UINT32 k;
+                            for (k = 0; k < (x_incr & ~3U); k += 4) {
+                                dest_ptr[k] = src_ptr[k * buf_col_stride];
+                                dest_ptr[k + 1] = src_ptr[(k + 1) * buf_col_stride];
+                                dest_ptr[k + 2] = src_ptr[(k + 2) * buf_col_stride];
+                                dest_ptr[k + 3] = src_ptr[(k + 3) * buf_col_stride];
+                            }
+                            for (; k < x_incr; k++) {
+                                dest_ptr[k] = src_ptr[k * buf_col_stride];
+                            }
+                            src_ptr += buf_line_stride;
+                            dest_ptr += block_width;
+                        }
                     } else {
                         /* General case */
                         for (j = 0; j < y_incr; j++) {