aboutsummaryrefslogtreecommitdiffstats
path: root/src/blind-transpose.c
diff options
context:
space:
mode:
authorMattias Andrée <maandree@kth.se>2017-05-08 22:08:36 +0200
committerMattias Andrée <maandree@kth.se>2017-05-08 22:08:36 +0200
commit2741eab8fcbe01af3972557e2df6e765a9450093 (patch)
treee3d5bc1beeb4cb2041e6b75df2ba60f6870e902a /src/blind-transpose.c
parentImprove performance of blind-transpose (diff)
downloadblind-2741eab8fcbe01af3972557e2df6e765a9450093.tar.gz
blind-2741eab8fcbe01af3972557e2df6e765a9450093.tar.bz2
blind-2741eab8fcbe01af3972557e2df6e765a9450093.tar.xz
Improve performance and memory usage of blind-transpose
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to '')
-rw-r--r--src/blind-transpose.c45
1 files changed, 30 insertions, 15 deletions
diff --git a/src/blind-transpose.c b/src/blind-transpose.c
index c2d2d11..5c53a0d 100644
--- a/src/blind-transpose.c
+++ b/src/blind-transpose.c
@@ -9,12 +9,31 @@
USAGE("")
+static size_t srcw, srch, srcwps, srchps, ps;
+
+#define PROCESS(TYPE)\
+ do {\
+ size_t x, i, n = ps / sizeof(TYPE);\
+ char *src, *img;\
+ for (x = 0; x < srchps; x += ps) {\
+ img = row + x;\
+ src = col + x * srcw;\
+ for (i = 0; i < n; i++)\
+ ((TYPE *)img)[i] = ((TYPE *)src)[i];\
+ }\
+ } while (0)
+
+static void process_double(char *row, char *col) {PROCESS(double);}
+static void process_float (char *row, char *col) {PROCESS(float);}
+static void process_char (char *row, char *col) {PROCESS(char);}
+
int
main(int argc, char *argv[])
{
struct stream stream;
- char *buf, *row, *pix, *image, *imag, *img;
- size_t n, srcw, srch, srcwps, srchps, ps, x, y, i;
+ char *buf, *image;
+ size_t n, y;
+ void (*process)(char *col, char *row);
UNOFLAGS(argc);
@@ -27,23 +46,19 @@ main(int argc, char *argv[])
echeck_frame_size(stream.width, stream.height, stream.pixel_size, 0, stream.file);
n = stream.height * stream.width * (ps = stream.pixel_size);
- buf = emalloc(n);
- image = emalloc(n);
-
srchps = srch * ps;
srcwps = srcw * ps;
+ buf = emalloc(n);
+ image = emalloc(srchps);
+
+ process = !(ps % sizeof(double)) ? process_double :
+ !(ps % sizeof(float)) ? process_float : process_char;
+
while (eread_frame(&stream, buf, n)) {
- for (y = 0; y < srchps; y += ps) {
- imag = image + y;
- row = buf + y * srcw;
- for (x = 0; x < srcwps; x += ps) {
- img = imag + x * srch;
- pix = row + x;
- for (i = 0; i < ps; i++)
- img[i] = pix[i];
- }
+ for (y = 0; y < srcwps; y += ps) {
+ process(image, buf + y);
+ ewriteall(STDOUT_FILENO, image, srchps, "<stdout>");
}
- ewriteall(STDOUT_FILENO, image, n, "<stdout>");
}
free(buf);