 	}
 }
 
-public struct Size {
-	var width: Int
-	var height: Int
+public struct Size: Comparable {
+	public var width: Int
+	public var height: Int
 
 	public init(width: Int, height: Int) {
 		self.width = width
 		self.height = height
 	}
+
+	public init(width: Int32, height: Int32) {
+		self.width = Int(width)
+		self.height = Int(height)
+	}
+}
+
+public func <(lhs: Size, rhs: Size) -> Bool {
+	return lhs.width < rhs.width && lhs.height < rhs.height
+}
+
+public func ==(lhs: Size, rhs: Size) -> Bool {
+	return lhs.width == rhs.width && lhs.height == rhs.height
 }
 
 public class Color {

	}

	public func resizedTo(width: Int, height: Int, applySmoothing: Bool = true) -> Image? {
		if applySmoothing {
			gdImageSetInterpolationMethod(internalImage, GD_BILINEAR_FIXED)
		} else {
			gdImageSetInterpolationMethod(internalImage, GD_NEAREST_NEIGHBOUR)
		}

		guard let output = gdImageScale(internalImage, UInt32(width), UInt32(height)) else { return nil }
		return Image(gdImage: output)
	}

	public func resizedTo(width: Int, applySmoothing: Bool = true) -> Image? {
		if applySmoothing {
			gdImageSetInterpolationMethod(internalImage, GD_BILINEAR_FIXED)
		} else {
			gdImageSetInterpolationMethod(internalImage, GD_NEAREST_NEIGHBOUR)
		}

		let currentSize = size
		let heightAdjustment = Double(width) / Double(currentSize.width)
		let newHeight = Double(currentSize.height) * Double(heightAdjustment)

		guard let output = gdImageScale(internalImage, UInt32(width), UInt32(newHeight)) else { return nil }
		return Image(gdImage: output)
	}

	public func resizedTo(height: Int, applySmoothing: Bool = true) -> Image? {
		if applySmoothing {
			gdImageSetInterpolationMethod(internalImage, GD_BILINEAR_FIXED)
		} else {
			gdImageSetInterpolationMethod(internalImage, GD_NEAREST_NEIGHBOUR)
		}

		let currentSize = size
		let widthAdjustment = Double(height) / Double(currentSize.height)
		let newWidth = Double(currentSize.width) * Double(widthAdjustment)

		guard let output = gdImageScale(internalImage, UInt32(newWidth), UInt32(height)) else { return nil }
		return Image(gdImage: output)
	}

	public func fill(from: Point, color: Color) {


	private var internalImage: gdImagePtr

	public var size: Size {
		return Size(width: internalImage.pointee.sx, height: internalImage.pointee.sy)
	}

	public init?(width: Int, height: Int) {
