summaryrefslogtreecommitdiff
path: root/src/lib/openjp2/sparse_array.c
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2017-09-01 16:31:10 +0200
committerEven Rouault <even.rouault@spatialys.com>2017-09-01 22:23:29 +0200
commit7017e67a01c378a7a1ee5e34dd544c793b5c23e4 (patch)
tree004d71810086ce991edcd1d6c0f2ad274f807402 /src/lib/openjp2/sparse_array.c
parent8a17be8945f6f8fcae3f9e5c7c4988e971d245ee (diff)
sparse_array: optimizations for lossy case
Diffstat (limited to 'src/lib/openjp2/sparse_array.c')
-rw-r--r--src/lib/openjp2/sparse_array.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/lib/openjp2/sparse_array.c b/src/lib/openjp2/sparse_array.c
index 48c4b23b..40459bdb 100644
--- a/src/lib/openjp2/sparse_array.c
+++ b/src/lib/openjp2/sparse_array.c
@@ -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++) {