summaryrefslogtreecommitdiff
path: root/dmagick
diff options
context:
space:
mode:
Diffstat (limited to 'dmagick')
-rw-r--r--dmagick/Image.d4
-rw-r--r--dmagick/ImageView.d152
2 files changed, 154 insertions, 2 deletions
diff --git a/dmagick/Image.d b/dmagick/Image.d
index 9db5336..b457bdb 100644
--- a/dmagick/Image.d
+++ b/dmagick/Image.d
@@ -2898,9 +2898,9 @@ class Image
imageRef = ImageRef(image);
}
- ImageView view(Geometry area)
+ dmagick.ImageView.ImageView view(Geometry area)
{
- return ImageView(this, area);
+ return new dmagick.ImageView.ImageView(this, area);
}
/**
diff --git a/dmagick/ImageView.d b/dmagick/ImageView.d
new file mode 100644
index 0000000..5cad837
--- /dev/null
+++ b/dmagick/ImageView.d
@@ -0,0 +1,152 @@
+module dmagick.ImageView;
+
+import std.array;
+
+import dmagick.Color;
+import dmagick.Exception;
+import dmagick.Geometry;
+import dmagick.Image;
+
+import dmagick.c.cache;
+import dmagick.c.geometry;
+import dmagick.c.pixel;
+
+class ImageView
+{
+ Image image;
+ RectangleInfo extent;
+
+ this(Image image, Geometry area)
+ {
+ if ( area.width + area.xOffset > image.columns ||
+ area.height + area.yOffset > image.rows )
+ {
+ throw new OptionException("Specified area is larger than the image");
+ }
+
+ this.image = image;
+ this.extent = area.rectangleInfo;
+ }
+
+ Row opIndex(size_t row)
+ {
+ PixelPacket* pixels =
+ GetAuthenticPixels(image.imageRef, extent.x, extent.y, 1, extent.width, DMagickExceptionInfo());
+
+ return Row(image, pixels[0 .. extent.width]);
+ }
+
+ ImageView opSlice()
+ {
+ return opSlice(0, extent.height);
+ }
+
+ ImageView opSlice(size_t upper, size_t lower)
+ {
+ RectangleInfo newExtent = extent;
+
+ newExtent.y += upper;
+ newExtent.height = lower - upper;
+
+ return new Rows(image, Geometry(newExtent));
+ }
+
+ int opApply(int delegate(ref Row) dg)
+ {
+ //Use UpdateImageViewIterator ?
+ }
+}
+
+class Rows : ImageView
+{
+ this(Image image, Geometry area)
+ {
+ super(image, area);
+ }
+
+ override Row opIndex(size_t column)
+ {
+ PixelPacket* pixels =
+ GetAuthenticPixels(image.imageRef, extent.x, extent.y, extent.height, 1, DMagickExceptionInfo());
+
+ return Row(image, pixels[0 .. extent.width]);
+ }
+
+ override ImageView opSlice()
+ {
+ return opSlice(0, extent.width);
+ }
+
+ override ImageView opSlice(size_t left, size_t right)
+ {
+ RectangleInfo newExtent = extent;
+
+ newExtent.x += left;
+ newExtent.width = right - left;
+
+ return new ImageView(image, Geometry(newExtent));
+ }
+}
+
+struct Row
+{
+ Image image;
+ PixelPacket[] pixels;
+
+ this(Image image, PixelPacket[] pixels)
+ {
+ this.image = image;
+ this.pixels = pixels;
+ }
+
+ ~this()
+ {
+ SyncAuthenticPixels(image.imageRef, DMagickExceptionInfo());
+ }
+
+ Color opIndex(size_t pixel)
+ {
+ return new Color(&(pixels[pixel]));
+ }
+
+ void opIndexAssign(Color color, size_t i)
+ {
+ pixels[i] = color.pixelPacket;
+ }
+
+ Row opSlice()
+ {
+ return this;
+ }
+
+ Row opSilce(size_t left, size_t right)
+ {
+ return Row(image, pixels[left .. right]);
+ }
+
+ void opSliceAssign(Color color)
+ {
+ opSliceAssign(color, 0, pixels.length);
+ }
+
+ void opSliceAssign(Color color, size_t left, size_t right)
+ {
+ foreach( i; left .. right )
+ this[i] = color;
+ }
+
+ @property bool empty()
+ {
+ return pixels.empty;
+ }
+
+ Color front()
+ {
+ return this[0];
+ }
+
+ void popFront()
+ {
+ pixels.popFront();
+ }
+}