summaryrefslogtreecommitdiff
path: root/dmagick/Geometry.d
diff options
context:
space:
mode:
authorMike Wey2011-02-23 23:25:17 +0100
committerMike Wey2011-02-23 23:25:17 +0100
commitd05d093854bdadad03456fbccc1a2da490ce410a (patch)
tree2aa59739c4df18fb120b8120d0301fc9886d4714 /dmagick/Geometry.d
parent0bbb355681ad7a9dc3be943152d68e90e4ff0974 (diff)
Add Geometry.d
Diffstat (limited to 'dmagick/Geometry.d')
-rw-r--r--dmagick/Geometry.d108
1 files changed, 108 insertions, 0 deletions
diff --git a/dmagick/Geometry.d b/dmagick/Geometry.d
new file mode 100644
index 0000000..dec6b4f
--- /dev/null
+++ b/dmagick/Geometry.d
@@ -0,0 +1,108 @@
+/**
+ * A class to specify a geometry argument.
+ *
+ * Copyright: Mike Wey 2011
+ * License: To be determined
+ * Authors: Mike Wey
+ */
+
+module dmagick.Geometry;
+
+import std.conv;
+import std.ctype;
+import std.string;
+import core.sys.posix.sys.types;
+
+import dmagick.c.geometry;
+import dmagick.c.magickString;
+import dmagick.c.magickType;
+
+struct Geometry
+{
+ size_t width;
+ size_t height;
+ ssize_t xOffset;
+ ssize_t yOffset;
+ bool percent;
+ bool minimum;
+ bool keepAspect = true;
+ bool greater;
+ bool less;
+
+ this(string geometry)
+ {
+ MagickStatusType flags;
+
+ //If the strin starts with a letter assume it's a Page Geometry.
+ if ( isalpha(geometry[0]) )
+ {
+ char* geo = GetPageGeometry(toStringz(geometry));
+
+ if( geo !is null )
+ {
+ geometry = to!(string)(geo);
+ DestroyString(geo);
+ }
+ }
+
+ flags = GetGeometry(toStringz(geometry), &xOffset, &yOffset, &width, &height);
+
+ percent = ( flags & GeometryFlags.PercentValue ) != 0;
+ minimum = ( flags & GeometryFlags.MinimumValue ) != 0;
+ keepAspect = ( flags & GeometryFlags.AspectValue ) == 0;
+ greater = ( flags & GeometryFlags.GreaterValue ) != 0;
+ less = ( flags & GeometryFlags.LessValue ) != 0;
+ }
+
+ unittest
+ {
+ Geometry geo = Geometry("200x150-50+25!");
+ assert( geo.width == 200 && geo.xOffset == -50 );
+ assert( geo.keepAspect == false );
+
+ geo = Geometry("A4");
+ assert( geo.width == 595 && geo.height == 842);
+ }
+
+ this(size_t width, size_t height, ssize_t xOffset, ssize_t yOffset)
+ {
+ this.width = width;
+ this.height = height;
+ this.xOffset = xOffset;
+ this.yOffset = yOffset;
+ }
+
+ string toString()
+ {
+ string geometry;
+
+ if ( width > 0 )
+ geometry ~= to!(string)(width);
+
+ if ( height > 0 )
+ geometry ~= "x" ~ to!(string)(height);
+
+ if ( xOffset != 0 && yOffset != 0 )
+ geometry ~= format("%+s%+s", xOffset, yOffset);
+
+ geometry ~= format("%s%s%s%s%s",
+ percent ? "%" : "",
+ minimum ? "^" : "",
+ keepAspect ? "" : "!",
+ less ? "<" : "",
+ greater ? ">" : "");
+
+ return geometry;
+ }
+
+ unittest
+ {
+ Geometry geo = Geometry("200x150-50+25!");
+ assert( geo.toString == "200x150-50+25!");
+ }
+
+ int opCmp(ref const Geometry geometry)
+ {
+ return width*height - geometry.width*geometry.height;
+ }
+}