[gegl] gegl/buffer: optimize pix-column fetching



commit ba66d9ed139f6630c6938397be0c290d9a0211ec
Author: Øyvind Kolås <pippin gimp org>
Date:   Wed Dec 27 11:55:12 2017 +0100

    gegl/buffer: optimize pix-column fetching

 gegl/buffer/gegl-buffer-access.c |   97 +++++++++++++++++++++++++++++++++++---
 1 files changed, 90 insertions(+), 7 deletions(-)
---
diff --git a/gegl/buffer/gegl-buffer-access.c b/gegl/buffer/gegl-buffer-access.c
index 8748f79..19bb10e 100644
--- a/gegl/buffer/gegl-buffer-access.c
+++ b/gegl/buffer/gegl-buffer-access.c
@@ -654,14 +654,97 @@ gegl_buffer_iterate_read_simple (GeglBuffer          *buffer,
             }
           else
             {
-              for (row = offsety;
-                   row < tile_height && y < height;
-                   row++, y++)
+              switch (pixels * px_size)
                 {
-                  memcpy (bp, tp, pixels * px_size);
-
-                  tp += tile_stride;
-                  bp += buf_stride;
+                  case 1:
+                    for (row = offsety; row < tile_height && y < height;
+                         row++, y++)
+                      {
+                         bp[0] = tp[0];
+                         tp += tile_stride;
+                         bp += buf_stride;
+                      }
+                    break;
+                  case 2:
+                    for (row = offsety; row < tile_height && y < height;
+                         row++, y++)
+                      {
+                         ((uint16_t*)bp)[0] = ((uint16_t*)tp)[0];
+                         tp += tile_stride;
+                         bp += buf_stride;
+                      }
+                    break;
+                  case 4:
+                    for (row = offsety; row < tile_height && y < height;
+                         row++, y++)
+                      {
+                         ((uint32_t*)bp)[0] = ((uint32_t*)tp)[0];
+                         tp += tile_stride;
+                         bp += buf_stride;
+                      }
+                    break;
+                  case 8:
+                    for (row = offsety; row < tile_height && y < height;
+                         row++, y++)
+                      {
+                         ((uint64_t*)bp)[0] = ((uint64_t*)tp)[0];
+                         tp += tile_stride;
+                         bp += buf_stride;
+                      }
+                    break;
+                  case 12:
+                    for (row = offsety; row < tile_height && y < height;
+                         row++, y++)
+                      {
+                         ((uint32_t*)bp)[0] = ((uint32_t*)tp)[0];
+                         ((uint32_t*)bp)[1] = ((uint32_t*)tp)[1];
+                         ((uint32_t*)bp)[2] = ((uint32_t*)tp)[2];
+                         tp += tile_stride;
+                         bp += buf_stride;
+                      }
+                    break;
+                  case 16:
+                    for (row = offsety; row < tile_height && y < height;
+                         row++, y++)
+                      {
+                         ((uint64_t*)bp)[0] = ((uint64_t*)tp)[0];
+                         ((uint64_t*)bp)[1] = ((uint64_t*)tp)[1];
+                         tp += tile_stride;
+                         bp += buf_stride;
+                      }
+                    break;
+                  case 24:
+                    for (row = offsety; row < tile_height && y < height;
+                         row++, y++)
+                      {
+                         ((uint64_t*)bp)[0] = ((uint64_t*)tp)[0];
+                         ((uint64_t*)bp)[1] = ((uint64_t*)tp)[1];
+                         ((uint64_t*)bp)[2] = ((uint64_t*)tp)[2];
+                         tp += tile_stride;
+                         bp += buf_stride;
+                      }
+                    break;
+                  case 32:
+                    for (row = offsety; row < tile_height && y < height;
+                         row++, y++)
+                      {
+                         ((uint64_t*)bp)[0] = ((uint64_t*)tp)[0];
+                         ((uint64_t*)bp)[1] = ((uint64_t*)tp)[1];
+                         ((uint64_t*)bp)[2] = ((uint64_t*)tp)[2];
+                         ((uint64_t*)bp)[3] = ((uint64_t*)tp)[3];
+                         tp += tile_stride;
+                         bp += buf_stride;
+                      }
+                    break;
+                  default:
+                    for (row = offsety;
+                         row < tile_height && y < height;
+                         row++, y++)
+                      {
+                         memcpy (bp, tp, pixels * px_size);
+                         tp += tile_stride;
+                         bp += buf_stride;
+                      }
                 }
             }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]