From 05a2449ac7a306b36ede759ac4ab3b4a13374518 Mon Sep 17 00:00:00 2001 From: Mike Wey Date: Sun, 31 Jul 2011 22:42:39 +0200 Subject: Forgot to check in the new file. --- dmagick/Image.d | 4 +- dmagick/ImageView.d | 152 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 154 insertions(+), 2 deletions(-) create mode 100644 dmagick/ImageView.d 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(); + } +} -- cgit v1.2.3