summaryrefslogtreecommitdiffstats
path: root/gfx/thebes/gfxRect.h
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/thebes/gfxRect.h')
-rw-r--r--gfx/thebes/gfxRect.h148
1 files changed, 148 insertions, 0 deletions
diff --git a/gfx/thebes/gfxRect.h b/gfx/thebes/gfxRect.h
new file mode 100644
index 000000000..56d5c43e5
--- /dev/null
+++ b/gfx/thebes/gfxRect.h
@@ -0,0 +1,148 @@
+/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GFX_RECT_H
+#define GFX_RECT_H
+
+#include "gfxTypes.h"
+#include "gfxPoint.h"
+#include "nsDebug.h"
+#include "nsRect.h"
+#include "mozilla/gfx/BaseMargin.h"
+#include "mozilla/gfx/BaseRect.h"
+#include "mozilla/gfx/MatrixFwd.h"
+#include "mozilla/Assertions.h"
+
+struct gfxQuad;
+
+struct gfxMargin : public mozilla::gfx::BaseMargin<gfxFloat, gfxMargin> {
+ typedef mozilla::gfx::BaseMargin<gfxFloat, gfxMargin> Super;
+
+ // Constructors
+ gfxMargin() : Super() {}
+ gfxMargin(const gfxMargin& aMargin) : Super(aMargin) {}
+ gfxMargin(gfxFloat aTop, gfxFloat aRight, gfxFloat aBottom, gfxFloat aLeft)
+ : Super(aTop, aRight, aBottom, aLeft) {}
+};
+
+namespace mozilla {
+ namespace css {
+ enum Corner {
+ // this order is important!
+ eCornerTopLeft = 0,
+ eCornerTopRight = 1,
+ eCornerBottomRight = 2,
+ eCornerBottomLeft = 3,
+ eNumCorners = 4
+ };
+ } // namespace css
+} // namespace mozilla
+#define NS_CORNER_TOP_LEFT mozilla::css::eCornerTopLeft
+#define NS_CORNER_TOP_RIGHT mozilla::css::eCornerTopRight
+#define NS_CORNER_BOTTOM_RIGHT mozilla::css::eCornerBottomRight
+#define NS_CORNER_BOTTOM_LEFT mozilla::css::eCornerBottomLeft
+#define NS_NUM_CORNERS mozilla::css::eNumCorners
+
+#define NS_FOR_CSS_CORNERS(var_) \
+ for (mozilla::css::Corner var_ = NS_CORNER_TOP_LEFT; \
+ var_ <= NS_CORNER_BOTTOM_LEFT; \
+ var_++)
+
+static inline mozilla::css::Corner operator++(mozilla::css::Corner& corner, int) {
+ NS_PRECONDITION(corner >= NS_CORNER_TOP_LEFT &&
+ corner < NS_NUM_CORNERS, "Out of range corner");
+ corner = mozilla::css::Corner(corner + 1);
+ return corner;
+}
+
+struct gfxRect :
+ public mozilla::gfx::BaseRect<gfxFloat, gfxRect, gfxPoint, gfxSize, gfxMargin> {
+ typedef mozilla::gfx::BaseRect<gfxFloat, gfxRect, gfxPoint, gfxSize, gfxMargin> Super;
+
+ gfxRect() : Super() {}
+ gfxRect(const gfxPoint& aPos, const gfxSize& aSize) :
+ Super(aPos, aSize) {}
+ gfxRect(gfxFloat aX, gfxFloat aY, gfxFloat aWidth, gfxFloat aHeight) :
+ Super(aX, aY, aWidth, aHeight) {}
+
+ /**
+ * Return true if all components of this rect are within
+ * aEpsilon of integer coordinates, defined as
+ * |round(coord) - coord| <= |aEpsilon|
+ * for x,y,width,height.
+ */
+ bool WithinEpsilonOfIntegerPixels(gfxFloat aEpsilon) const;
+
+ gfxPoint AtCorner(mozilla::css::Corner corner) const {
+ switch (corner) {
+ case NS_CORNER_TOP_LEFT: return TopLeft();
+ case NS_CORNER_TOP_RIGHT: return TopRight();
+ case NS_CORNER_BOTTOM_RIGHT: return BottomRight();
+ case NS_CORNER_BOTTOM_LEFT: return BottomLeft();
+ default:
+ NS_ERROR("Invalid corner!");
+ break;
+ }
+ return gfxPoint(0.0, 0.0);
+ }
+
+ gfxPoint CCWCorner(mozilla::Side side) const {
+ switch (side) {
+ case NS_SIDE_TOP: return TopLeft();
+ case NS_SIDE_RIGHT: return TopRight();
+ case NS_SIDE_BOTTOM: return BottomRight();
+ case NS_SIDE_LEFT: return BottomLeft();
+ }
+ MOZ_CRASH("Incomplete switch");
+ }
+
+ gfxPoint CWCorner(mozilla::Side side) const {
+ switch (side) {
+ case NS_SIDE_TOP: return TopRight();
+ case NS_SIDE_RIGHT: return BottomRight();
+ case NS_SIDE_BOTTOM: return BottomLeft();
+ case NS_SIDE_LEFT: return TopLeft();
+ }
+ MOZ_CRASH("Incomplete switch");
+ }
+
+ /* Conditions this border to Cairo's max coordinate space.
+ * The caller can check IsEmpty() after Condition() -- if it's TRUE,
+ * the caller can possibly avoid doing any extra rendering.
+ */
+ void Condition();
+
+ void Scale(gfxFloat k) {
+ NS_ASSERTION(k >= 0.0, "Invalid (negative) scale factor");
+ x *= k;
+ y *= k;
+ width *= k;
+ height *= k;
+ }
+
+ void Scale(gfxFloat sx, gfxFloat sy) {
+ NS_ASSERTION(sx >= 0.0, "Invalid (negative) scale factor");
+ NS_ASSERTION(sy >= 0.0, "Invalid (negative) scale factor");
+ x *= sx;
+ y *= sy;
+ width *= sx;
+ height *= sy;
+ }
+
+ void ScaleInverse(gfxFloat k) {
+ NS_ASSERTION(k > 0.0, "Invalid (negative) scale factor");
+ x /= k;
+ y /= k;
+ width /= k;
+ height /= k;
+ }
+
+ /*
+ * Transform this rectangle with aMatrix, resulting in a gfxQuad.
+ */
+ gfxQuad TransformToQuad(const mozilla::gfx::Matrix4x4 &aMatrix) const;
+};
+
+#endif /* GFX_RECT_H */