view dynamin/painting/coordinates.d @ 0:aa4efef0f0b1

Initial commit of code.
author Jordan Miner <jminer7@gmail.com>
date Mon, 15 Jun 2009 22:10:48 -0500
parents
children dccadd297348
line wrap: on
line source

// Written in the D programming language
// www.digitalmars.com/d/

/*
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is the Dynamin library.
 *
 * The Initial Developer of the Original Code is Jordan Miner.
 * Portions created by the Initial Developer are Copyright (C) 2006-2009
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 *   Jordan Miner <jminer7@gmail.com>
 *
 */

module dynamin.painting.coordinates;

import dynamin.core.string;
import dynamin.core.math;

///
struct Point {
private:
	float _x = 0, _y = 0;
public:
	///
	static Point opCall() {
		Point pt;
		return pt;
	}
	///
	static Point opCall(float x, float y) {
		Point pt;
		pt._x = x;
		pt._y = y;
		return pt;
	}
	///
	float x() { return _x; }
	///
	void x(float f) { _x = f; }
	///
	float y() { return _y; }
	///
	void y(float f) { _y = f; }
	///
	Point opNeg() {
		Point pt2;
		pt2._x = -_x;
		pt2._y = -_y;
		return pt2;
	}
	///
	Point opAdd(Point pt) {
		Point pt2;
		pt2._x = _x + pt._x;
		pt2._y = _y + pt._y;
		return pt2;
	}
	///
	Point opSub(Point pt) {
		Point pt2;
		pt2._x = _x - pt._x;
		pt2._y = _y - pt._y;
		return pt2;
	}
	///
	Rect opAdd(Size size) {
		Rect rect;
		rect._x = _x;
		rect._y = _y;
		rect._width = size._width;
		rect._height = size._height;
		return rect;
	}
	string toString() {
		return format("Point [x={}, y={}]", _x, _y);
	}
}

///
struct Size {
private:
	float _width = 0, _height = 0;
public:
	///
	static Size opCall() {
		Size size;
		return size;
	}
	///
	static Size opCall(float width, float height) {
		Size size;
		size._width = width;
		size._height = height;
		return size;
	}
	///
	float width() { return _width; }
	///
	void width(float f) { _width = f; }
	///
	float height() { return _height; }
	///
	void height(float f) { _height = f; }
	///
	Size opAdd(Size size) {
		Size size2;
		size2._width = _width + size._width;
		size2._height = _height + size._height;
		return size2;
	}
	///
	Size opSub(Size size) {
		Size size2;
		size2._width = _width - size._width;
		size2._height = _height - size._height;
		return size2;
	}
	///
	Size opAdd(BorderSize border) {
		Size size2;
		size2._width = _width + border._left + border._right;
		size2._height = _height + border._top + border._bottom;
		return size2;
	}
	///
	Size opSub(BorderSize border) {
		Size size2;
		size2._width = _width - border._left - border._right;
		size2._height = _height - border._top - border._bottom;
		return size2;
	}
	string toString() {
		return format("Size [width={}, height={}]", _width, _height);
	}
}

///
struct Rect {
private:
	float _x = 0, _y = 0, _width = 0, _height = 0;
public:
	static Rect opCall() {
		Rect rect;
		return rect;
	}
	static Rect opCall(float x, float y, float width, float height) {
		Rect rect;
		rect._x = x;
		rect._y = y;
		rect._width = width;
		rect._height = height;
		return rect;
	}
	///
	float x() { return _x; }
	///
	void x(float f) { _x = f; }
	///
	float y() { return _y; }
	///
	void y(float f) { _y = f; }
	///
	float width() { return _width; }
	///
	void width(float f) { _width = f; }
	///
	float height() { return _height; }
	///
	void height(float f) { _height = f; }
	///
	float right() { return _x+_width; }
	///
	float bottom() { return _y+_height; }
	///
	Rect opAdd(Rect rect) {
		Rect rect2;
		rect2._x = _x + rect._x;
		rect2._y = _y + rect._y;
		rect2._width = _width + rect._width;
		rect2._height = _height + rect._height;
		return rect2;
	}
	///
	Rect opSub(Rect rect) {
		Rect rect2;
		rect2._x = _x - rect._x;
		rect2._y = _y - rect._y;
		rect2._width = _width - rect._width;
		rect2._height = _height - rect._height;
		return rect2;
	}
	///
	Rect opAdd(Point pt) {
		Rect rect2;
		rect2._x = _x + pt._x;
		rect2._y = _y + pt._y;
		rect2._width = _width;
		rect2._height = _height;
		return rect2;
	}
	///
	Rect opSub(Point pt) {
		Rect rect2;
		rect2._x = _x - pt._x;
		rect2._y = _y - pt._y;
		rect2._width = _width;
		rect2._height = _height;
		return rect2;
	}
	///
	Rect opAdd(Size size) {
		Rect rect2;
		rect2._x = _x;
		rect2._y = _y;
		rect2._width = _width + size._width;
		rect2._height = _height + size._height;
		return rect2;
	}
	///
	Rect opSub(Size size) {
		Rect rect2;
		rect2._x = _x;
		rect2._y = _y;
		rect2._width = _width - size._width;
		rect2._height = _height - size._height;
		return rect2;
	}
	///
	Rect opAdd(BorderSize border) {
		Rect rect2;
		rect2._x = _x - border._left;
		rect2._y = _y - border._top;
		rect2._width = _width + border._left + border._right;
		rect2._height = _height + border._top + border._bottom;
		return rect2;
	}
	///
	Rect opSub(BorderSize border) {
		Rect rect2;
		rect2._x = _x + border._left;
		rect2._y = _y + border._top;
		rect2._width = _width - border._left - border._right;
		rect2._height = _height - border._top - border._bottom;
		return rect2;
	}
	bool contains(Point pt) {
		return pt.x >= x && pt.y >= y && pt.x < right && pt.y < bottom;
	}
	Rect getUnion(Rect rect) {
		auto x2 = min(_x, rect._x);
		auto y2 = min(_y, rect._y);
		Rect rect2;
		rect2._width = max(_x+_width, rect._x+rect._width)-x2;
		rect2._height = max(_y+_height, rect._y+rect._height)-y2;
		rect2._x = x2;
		rect2._y = y2;
		return rect2;
	}
	string toString() {
		return format("Rect [x={}, y={}, width={}, height={}]",
			_x, _y, _width, _height);
	}
}
unittest {
	assert(Rect(20, 2, 70, 5).getUnion(Rect(22, 3, 70, 4)) == Rect(20, 2, 72, 5));
}

///
struct BorderSize {
private:
	float _left = 0, _top = 0, _right = 0, _bottom = 0;
public:
	static BorderSize opCall() {
		BorderSize border;
		return border;
	}
	static BorderSize opCall(float _left, float _top, float _right, float _bottom) {
		BorderSize border;
		border._left = _left;
		border._top = _top;
		border._right = _right;
		border._bottom = _bottom;
		return border;
	}
	///
	float left() { return _left; }
	///
	void left(float f) { _left = f; }
	///
	float top() { return _top; }
	///
	void top(float f) { _top = f; }
	///
	float right() { return _right; }
	///
	void right(float f) { _right = f; }
	///
	float bottom() { return _bottom; }
	///
	void bottom(float f) { _bottom = f; }
	///
	BorderSize opAdd(BorderSize border) {
		BorderSize border2;
		border2._left = _left + border._left;
		border2._right = _right + border._right;
		border2._top = _top + border._top;
		border2._bottom = _bottom + border._bottom;
		return border2;
	}
	///
	BorderSize opSub(BorderSize border) {
		BorderSize border2;
		border2._left = _left - border._left;
		border2._right = _right - border._right;
		border2._top = _top - border._top;
		border2._bottom = _bottom - border._bottom;
		return border2;
	}
	string toString() {
		return format("BorderSize [_left={}, _top={}, _right={}, _bottom={}]",
			_left, _top, _right, _bottom);
	}
}

unittest {
	Point pt = Point(7, 9);
	assert(pt.x == 7);
	assert(pt.y == 9);
	Rect rect = pt + Size(15, 13);
	assert(rect == Rect(7, 9, 15, 13));
	assert(Size(15, 10) + BorderSize(3, 5, 1, 7) == Size(19, 22));
}