1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
3 * This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "nsScriptableRegion.h"
8 #include <stdint.h> // for uint32_t
9 #include <sys/types.h> // for int32_t
10 #include "js/RootingAPI.h" // for Rooted
11 #include "js/Value.h" // for INT_TO_JSVAL, etc
12 #include "jsapi.h" // for JS_DefineElement, etc
13 #include "mozilla/Assertions.h" // for MOZ_ASSERT_HELPER2
14 #include "nsError.h" // for NS_OK, NS_ERROR_FAILURE, etc
16 #include "nsRect.h" // for nsIntRect
17 #include "nscore.h" // for NS_IMETHODIMP
22 nsScriptableRegion::nsScriptableRegion()
26 NS_IMPL_ISUPPORTS(nsScriptableRegion
, nsIScriptableRegion
)
28 NS_IMETHODIMP
nsScriptableRegion::Init()
33 NS_IMETHODIMP
nsScriptableRegion::SetToRegion(nsIScriptableRegion
*aRegion
)
35 aRegion
->GetRegion(&mRegion
);
39 NS_IMETHODIMP
nsScriptableRegion::SetToRect(int32_t aX
, int32_t aY
, int32_t aWidth
, int32_t aHeight
)
41 mRegion
= nsIntRect(aX
, aY
, aWidth
, aHeight
);
45 NS_IMETHODIMP
nsScriptableRegion::IntersectRegion(nsIScriptableRegion
*aRegion
)
48 aRegion
->GetRegion(®ion
);
49 mRegion
.And(mRegion
, region
);
53 NS_IMETHODIMP
nsScriptableRegion::IntersectRect(int32_t aX
, int32_t aY
, int32_t aWidth
, int32_t aHeight
)
55 mRegion
.And(mRegion
, nsIntRect(aX
, aY
, aWidth
, aHeight
));
59 NS_IMETHODIMP
nsScriptableRegion::UnionRegion(nsIScriptableRegion
*aRegion
)
62 aRegion
->GetRegion(®ion
);
63 mRegion
.Or(mRegion
, region
);
67 NS_IMETHODIMP
nsScriptableRegion::UnionRect(int32_t aX
, int32_t aY
, int32_t aWidth
, int32_t aHeight
)
69 mRegion
.Or(mRegion
, nsIntRect(aX
, aY
, aWidth
, aHeight
));
73 NS_IMETHODIMP
nsScriptableRegion::SubtractRegion(nsIScriptableRegion
*aRegion
)
76 aRegion
->GetRegion(®ion
);
77 mRegion
.Sub(mRegion
, region
);
81 NS_IMETHODIMP
nsScriptableRegion::SubtractRect(int32_t aX
, int32_t aY
, int32_t aWidth
, int32_t aHeight
)
83 mRegion
.Sub(mRegion
, nsIntRect(aX
, aY
, aWidth
, aHeight
));
87 NS_IMETHODIMP
nsScriptableRegion::IsEmpty(bool *isEmpty
)
89 *isEmpty
= mRegion
.IsEmpty();
93 NS_IMETHODIMP
nsScriptableRegion::IsEqualRegion(nsIScriptableRegion
*aRegion
, bool *isEqual
)
96 aRegion
->GetRegion(®ion
);
97 *isEqual
= mRegion
.IsEqual(region
);
101 NS_IMETHODIMP
nsScriptableRegion::GetBoundingBox(int32_t *aX
, int32_t *aY
, int32_t *aWidth
, int32_t *aHeight
)
103 nsIntRect boundRect
= mRegion
.GetBounds();
106 *aWidth
= boundRect
.width
;
107 *aHeight
= boundRect
.height
;
111 NS_IMETHODIMP
nsScriptableRegion::Offset(int32_t aXOffset
, int32_t aYOffset
)
113 mRegion
.MoveBy(aXOffset
, aYOffset
);
117 NS_IMETHODIMP
nsScriptableRegion::ContainsRect(int32_t aX
, int32_t aY
, int32_t aWidth
, int32_t aHeight
, bool *containsRect
)
119 *containsRect
= mRegion
.Contains(nsIntRect(aX
, aY
, aWidth
, aHeight
));
124 NS_IMETHODIMP
nsScriptableRegion::GetRegion(nsIntRegion
* outRgn
)
130 NS_IMETHODIMP
nsScriptableRegion::GetRects(JSContext
* aCx
, JS::MutableHandle
<JS::Value
> aRects
)
132 uint32_t numRects
= mRegion
.GetNumRects();
139 JS::Rooted
<JSObject
*> destArray(aCx
, JS_NewArrayObject(aCx
, numRects
* 4));
141 return NS_ERROR_OUT_OF_MEMORY
;
144 aRects
.setObject(*destArray
);
147 nsIntRegionRectIterator
iter(mRegion
);
148 const nsIntRect
*rect
;
150 while ((rect
= iter
.Next())) {
151 if (!JS_DefineElement(aCx
, destArray
, n
, rect
->x
, JSPROP_ENUMERATE
) ||
152 !JS_DefineElement(aCx
, destArray
, n
+ 1, rect
->y
, JSPROP_ENUMERATE
) ||
153 !JS_DefineElement(aCx
, destArray
, n
+ 2, rect
->width
, JSPROP_ENUMERATE
) ||
154 !JS_DefineElement(aCx
, destArray
, n
+ 3, rect
->height
, JSPROP_ENUMERATE
)) {
155 return NS_ERROR_FAILURE
;