From b518ce8977c0b97dd2236fc8cbc7dad1dd70511b Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Fri, 2 Jun 2017 21:00:47 +0200 Subject: Add blind-disperse, blind-split-rows, and blind-split-cols MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- src/stream.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) (limited to 'src/stream.c') diff --git a/src/stream.c b/src/stream.c index 1f361a4..6c9dc72 100644 --- a/src/stream.c +++ b/src/stream.c @@ -270,8 +270,7 @@ enread_segment(int status, struct stream *stream, void *buf, size_t n) size_t ensend_frames(int status, struct stream *stream, int outfd, size_t frames, const char *outfname) { - size_t h, w, p, n; - size_t ret = 0; + size_t h, w, p, n, ret; for (ret = 0; ret < frames; ret++) { for (p = stream->pixel_size; p; p--) { @@ -295,6 +294,54 @@ done: } +size_t +ensend_rows(int status, struct stream *stream, int outfd, size_t rows, const char *outfname) +{ + size_t w, p, n, ret; + + for (ret = 0; ret < rows; ret++) { + for (p = stream->pixel_size; p; p--) { + for (w = stream->width; w; w -= n, stream->ptr -= n) { + if (!stream->ptr && !enread_stream(status, stream, w)) + goto done; + n = MIN(stream->ptr, w); + if (outfd >= 0) + enwriteall(status, outfd, stream->buf, n, outfname); + } + } + } + + return ret; +done: + if (p != stream->pixel_size || w != stream->width) + enprintf(status, "%s: incomplete row", stream->file); + return ret; +} + + +size_t +ensend_pixels(int status, struct stream *stream, int outfd, size_t pixels, const char *outfname) +{ + size_t p, n, ret; + + for (ret = 0; ret < pixels; ret++) { + for (p = stream->pixel_size; p; p -= n, stream->ptr -= n) { + if (!stream->ptr && !enread_stream(status, stream, p)) + goto done; + n = MIN(stream->ptr, p); + if (outfd >= 0) + enwriteall(status, outfd, stream->buf, n, outfname); + } + } + + return ret; +done: + if (p != stream->pixel_size) + enprintf(status, "%s: incomplete pixel", stream->file); + return ret; +} + + int ensend_stream(int status, struct stream *stream, int outfd, const char *outfname) { -- cgit v1.2.3-70-g09d2