summaryrefslogtreecommitdiff
path: root/dmagick/Image.d
diff options
context:
space:
mode:
authorMike Wey2011-06-12 17:37:35 +0200
committerMike Wey2011-06-12 17:37:35 +0200
commitf825c1de7c0e39fb13fe2bdcc93155b8608479a0 (patch)
tree218278232d55529345c5566494a6d0e440baf4cf /dmagick/Image.d
parent0ed618b81366dd148fa2df70ed13a750b58ca733 (diff)
Add a mathemathical composite and compositeTiled
Diffstat (limited to 'dmagick/Image.d')
-rw-r--r--dmagick/Image.d98
1 files changed, 86 insertions, 12 deletions
diff --git a/dmagick/Image.d b/dmagick/Image.d
index 0aa0167..9b74909 100644
--- a/dmagick/Image.d
+++ b/dmagick/Image.d
@@ -28,6 +28,7 @@ import dmagick.c.cacheView;
import dmagick.c.constitute;
import dmagick.c.colormap;
import dmagick.c.colorspace;
+import dmagick.c.compare;
import dmagick.c.composite;
import dmagick.c.compress;
import dmagick.c.decorate;
@@ -722,20 +723,59 @@ class Image
*/
bool compare(const(Image) referenceImage)
{
- bool isEqual = IsImagesEqual(imageRef, referenceImage.ImageRef) == 1;
+ bool isEqual = IsImagesEqual(imageRef, referenceImage.imageRef) == 1;
DMagickException.throwException(&(imageRef.exception));
- return isEqual;
+ return false; //isEqual;
}
/**
* Composites dest onto this image using the specified composite operator.
*
* Params:
- * compositeImage =
- * Image to use in to composite operation.
- * compositeOp =
- * The composite operation to use.
+ * overlay = Image to use in to composite operation.
+ * compositeOp = The composite operation to use.
+ * xOffset = The x-offset of the composited image,
+ * measured from the upper-left corner
+ * of the image.
+ * yOffset = The y-offset of the composited image,
+ * measured from the upper-left corner
+ * of the image.
+ * gravity = The gravity that defines the location of the
+ * location of overlay.
+ */
+ void composite(
+ const(Image) overlay,
+ CompositeOperator compositeOp,
+ ssize_t xOffset,
+ ssize_t yOffset)
+ {
+ CompositeImage(imageRef, compositeOp, overlay.imageRef, xOffset, yOffset);
+
+ DMagickException.throwException(&(imageRef.exception));
+ }
+
+ ///ditto
+ void composite(
+ const(Image) overlay,
+ CompositeOperator compositeOp,
+ GravityType gravity = GravityType.NorthWestGravity)
+ {
+ RectangleInfo geometry;
+
+ SetGeometry(overlay.imageRef, &geometry);
+ GravityAdjustGeometry(columns, rows, gravity, &geometry);
+
+ composite(overlay, compositeOp, geometry.x, geometry.y);
+ }
+
+ /**
+ * Merge the source and destination images according to the
+ * formula a*Sc*Dc + b*Sc + c*Dc + d where Sc is the source
+ * pixel and Dc is the destination pixel.
+ *
+ * Params:
+ * overlay = Image to use in to composite operation.
* xOffset = The x-offset of the composited image,
* measured from the upper-left corner
* of the image.
@@ -743,24 +783,58 @@ class Image
* measured from the upper-left corner
* of the image.
* gravity = The gravity that defines the location of the
- * location of compositeImage.
+ * location of overlay.
*/
- void composite(const(Image) compositeImage, CompositeOperator compositeOp, ssize_t xOffset, ssize_t yOffset)
+ void composite(
+ const(Image) overlay,
+ double a,
+ double b,
+ double c,
+ double d,
+ ssize_t xOffset,
+ ssize_t yOffset)
{
- CompositeImage(imageRef, compositeOp, overlay.imageRef, xOffset, yOffset);
+ SetImageArtifact(imageRef, "compose:args",
+ toStringz(std.string.format("%s,%s,%s,%s", a, b, c, d)));
+ scope(exit) RemoveImageArtifact(imageRef, "compose:args");
- DMagickException.throwException(&(imageRef.exception));
+ composite(overlay, CompositeOperator.MathematicsCompositeOp, xOffset, yOffset);
}
///ditto
- void composite(const(Image) compositeImage, CompositeOperator compositeOp, GravityType gravity = GravityType.NorthWestGravity)
+ void composite(
+ const(Image) overlay,
+ double a,
+ double b,
+ double c,
+ double d,
+ GravityType gravity = GravityType.NorthWestGravity)
{
RectangleInfo geometry;
SetGeometry(overlay.imageRef, &geometry);
GravityAdjustGeometry(columns, rows, gravity, &geometry);
- composite(overlay, geometry.x, geometry.y, compositeOp);
+ composite(overlay, a, b, c, d, geometry.x, geometry.y);
+ }
+
+ /**
+ * Composites multiple copies of the source image across and down
+ * the image, producing the same results as ImageMagick's composite
+ * command with the -tile option.
+ *
+ * Params:
+ * overlay = Image to use in to composite operation.
+ * compositeOp = The composite operation to use.
+ */
+ void compositeTiled(const(Image) overlay, CompositeOperator compositeOp)
+ {
+ SetImageArtifact(imageRef, "compose:outside-overlay", "false");
+ scope(exit) RemoveImageArtifact(imageRef, "compose:outside-overlay");
+
+ for ( size_t y = 0; y < rows; y += overlay.rows )
+ for ( size_t x = 0; x < columns; x += overlay.columns )
+ composite(overlay, compositeOp, x, y);
}
/**