From c7be75cbe983021f41f63a95ad07f422b6f34845 Mon Sep 17 00:00:00 2001 From: Mike Wey Date: Mon, 1 Aug 2011 23:01:57 +0200 Subject: A parallel foreach for the ImageView. --- dmagick/Image.d | 5 +++++ dmagick/ImageView.d | 27 ++++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/dmagick/Image.d b/dmagick/Image.d index b457bdb..9a10364 100644 --- a/dmagick/Image.d +++ b/dmagick/Image.d @@ -3492,6 +3492,11 @@ class Image copyString(imageRef.filename, str); options.filename = str; } + ///ditto + string filename() const + { + return to!(string)(imageRef.filename); + } /** * The image filesize in bytes. diff --git a/dmagick/ImageView.d b/dmagick/ImageView.d index 5cad837..e5411a4 100644 --- a/dmagick/ImageView.d +++ b/dmagick/ImageView.d @@ -1,6 +1,10 @@ module dmagick.ImageView; import std.array; +import std.parallelism; +import std.range; +import std.string; +import core.atomic; import dmagick.Color; import dmagick.Exception; @@ -31,7 +35,7 @@ class ImageView Row opIndex(size_t row) { PixelPacket* pixels = - GetAuthenticPixels(image.imageRef, extent.x, extent.y, 1, extent.width, DMagickExceptionInfo()); + GetAuthenticPixels(image.imageRef, extent.x, extent.y + row, 1, extent.width, DMagickExceptionInfo()); return Row(image, pixels[0 .. extent.width]); } @@ -53,6 +57,27 @@ class ImageView int opApply(int delegate(ref Row) dg) { + shared(int) progress; + + foreach ( row; taskPool.parallel(iota(extent.y, extent.y + extent.height)) ) + { + PixelPacket* pixels = + GetAuthenticPixels(image.imageRef, extent.x, row, 1, extent.width, DMagickExceptionInfo()); + + int result = dg(Row(image, pixels[0 .. extent.width])); + + if ( result ) + return result; + + if ( image.imageRef.progress_monitor !is null ) + { + atomicOp!"+="(progress, 1); + image.imageRef.progress_monitor(toStringz("ImageView/" ~ image.filename), progress, extent.height, image.imageRef.client_data); + } + } + + return 0; + //Use UpdateImageViewIterator ? } } -- cgit v1.2.3