summaryrefslogtreecommitdiff
path: root/dmagick/ImageView.d
diff options
context:
space:
mode:
authorMike Wey2011-08-01 23:01:57 +0200
committerMike Wey2011-08-01 23:01:57 +0200
commitc7be75cbe983021f41f63a95ad07f422b6f34845 (patch)
treedc20fd95db5f1f575aba6593b2a0f2d4e3eea314 /dmagick/ImageView.d
parent05a2449ac7a306b36ede759ac4ab3b4a13374518 (diff)
A parallel foreach for the ImageView.
Diffstat (limited to 'dmagick/ImageView.d')
-rw-r--r--dmagick/ImageView.d27
1 files changed, 26 insertions, 1 deletions
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 ?
}
}