зеркало из https://github.com/mozilla/gecko-dev.git
Bug 917755. Part 4: Add DOMQuad implementation. r=jst
--HG-- extra : rebase_source : e74d516f27c004ecf5deea40fb397c2a8f5acfae
This commit is contained in:
Родитель
416a4278f9
Коммит
67b726752b
|
@ -0,0 +1,159 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* 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/. */
|
||||
|
||||
#include "mozilla/dom/DOMQuad.h"
|
||||
|
||||
#include "mozilla/dom/DOMQuadBinding.h"
|
||||
#include "mozilla/dom/DOMPoint.h"
|
||||
#include "mozilla/dom/DOMRect.h"
|
||||
#include <algorithm>
|
||||
|
||||
using namespace mozilla;
|
||||
using namespace mozilla::dom;
|
||||
using namespace mozilla::gfx;
|
||||
|
||||
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_6(DOMQuad, mParent, mBounds, mPoints[0],
|
||||
mPoints[1], mPoints[2], mPoints[3])
|
||||
|
||||
NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(DOMQuad, AddRef)
|
||||
NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(DOMQuad, Release)
|
||||
|
||||
DOMQuad::DOMQuad(nsISupports* aParent, CSSPoint aPoints[4])
|
||||
: mParent(aParent)
|
||||
{
|
||||
SetIsDOMBinding();
|
||||
for (uint32_t i = 0; i < 4; ++i) {
|
||||
mPoints[i] = new DOMPoint(aParent, aPoints[i].x, aPoints[i].y);
|
||||
}
|
||||
}
|
||||
|
||||
DOMQuad::DOMQuad(nsISupports* aParent)
|
||||
: mParent(aParent)
|
||||
{
|
||||
SetIsDOMBinding();
|
||||
}
|
||||
|
||||
DOMQuad::~DOMQuad()
|
||||
{
|
||||
}
|
||||
|
||||
JSObject*
|
||||
DOMQuad::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aScope)
|
||||
{
|
||||
return DOMQuadBinding::Wrap(aCx, aScope, this);
|
||||
}
|
||||
|
||||
already_AddRefed<DOMQuad>
|
||||
DOMQuad::Constructor(const GlobalObject& aGlobal,
|
||||
const DOMPointInit& aP1,
|
||||
const DOMPointInit& aP2,
|
||||
const DOMPointInit& aP3,
|
||||
const DOMPointInit& aP4,
|
||||
ErrorResult& aRV)
|
||||
{
|
||||
nsRefPtr<DOMQuad> obj = new DOMQuad(aGlobal.GetAsSupports());
|
||||
obj->mPoints[0] = DOMPoint::Constructor(aGlobal, aP1, aRV);
|
||||
obj->mPoints[1] = DOMPoint::Constructor(aGlobal, aP2, aRV);
|
||||
obj->mPoints[2] = DOMPoint::Constructor(aGlobal, aP3, aRV);
|
||||
obj->mPoints[3] = DOMPoint::Constructor(aGlobal, aP4, aRV);
|
||||
return obj.forget();
|
||||
}
|
||||
|
||||
already_AddRefed<DOMQuad>
|
||||
DOMQuad::Constructor(const GlobalObject& aGlobal, const DOMRectReadOnly& aRect,
|
||||
ErrorResult& aRV)
|
||||
{
|
||||
CSSPoint points[4];
|
||||
Float x = aRect.X(), y = aRect.Y(), w = aRect.Width(), h = aRect.Height();
|
||||
points[0] = CSSPoint(x, y);
|
||||
points[1] = CSSPoint(x + w, y);
|
||||
points[2] = CSSPoint(x + w, y + h);
|
||||
points[3] = CSSPoint(x, y + h);
|
||||
nsRefPtr<DOMQuad> obj = new DOMQuad(aGlobal.GetAsSupports(), points);
|
||||
return obj.forget();
|
||||
}
|
||||
|
||||
class DOMQuad::QuadBounds MOZ_FINAL : public DOMRectReadOnly
|
||||
{
|
||||
public:
|
||||
QuadBounds(DOMQuad* aQuad)
|
||||
: DOMRectReadOnly(aQuad->GetParentObject())
|
||||
, mQuad(aQuad)
|
||||
{}
|
||||
|
||||
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(QuadBounds, DOMRectReadOnly)
|
||||
NS_DECL_ISUPPORTS_INHERITED
|
||||
|
||||
virtual double X() const
|
||||
{
|
||||
double x1, x2;
|
||||
GetHorizontalMinMax(&x1, &x2);
|
||||
return x1;
|
||||
}
|
||||
virtual double Y() const
|
||||
{
|
||||
double y1, y2;
|
||||
GetVerticalMinMax(&y1, &y2);
|
||||
return y1;
|
||||
}
|
||||
virtual double Width() const
|
||||
{
|
||||
double x1, x2;
|
||||
GetHorizontalMinMax(&x1, &x2);
|
||||
return x2 - x1;
|
||||
}
|
||||
virtual double Height() const
|
||||
{
|
||||
double y1, y2;
|
||||
GetVerticalMinMax(&y1, &y2);
|
||||
return y2 - y1;
|
||||
}
|
||||
|
||||
void GetHorizontalMinMax(double* aX1, double* aX2) const
|
||||
{
|
||||
double x1, x2;
|
||||
x1 = x2 = mQuad->Point(0)->X();
|
||||
for (uint32_t i = 1; i < 4; ++i) {
|
||||
double x = mQuad->Point(i)->X();
|
||||
x1 = std::min(x1, x);
|
||||
x2 = std::max(x2, x);
|
||||
}
|
||||
*aX1 = x1;
|
||||
*aX2 = x2;
|
||||
}
|
||||
|
||||
void GetVerticalMinMax(double* aY1, double* aY2) const
|
||||
{
|
||||
double y1, y2;
|
||||
y1 = y2 = mQuad->Point(0)->Y();
|
||||
for (uint32_t i = 1; i < 4; ++i) {
|
||||
double y = mQuad->Point(i)->Y();
|
||||
y1 = std::min(y1, y);
|
||||
y2 = std::max(y2, y);
|
||||
}
|
||||
*aY1 = y1;
|
||||
*aY2 = y2;
|
||||
}
|
||||
|
||||
protected:
|
||||
nsRefPtr<DOMQuad> mQuad;
|
||||
};
|
||||
|
||||
NS_IMPL_CYCLE_COLLECTION_INHERITED_1(DOMQuad::QuadBounds, DOMRectReadOnly, mQuad)
|
||||
|
||||
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(DOMQuad::QuadBounds)
|
||||
NS_INTERFACE_MAP_END_INHERITING(DOMRectReadOnly)
|
||||
|
||||
NS_IMPL_ADDREF_INHERITED(DOMQuad::QuadBounds, DOMRectReadOnly)
|
||||
NS_IMPL_RELEASE_INHERITED(DOMQuad::QuadBounds, DOMRectReadOnly)
|
||||
|
||||
DOMRectReadOnly*
|
||||
DOMQuad::Bounds() const
|
||||
{
|
||||
if (!mBounds) {
|
||||
mBounds = new QuadBounds(const_cast<DOMQuad*>(this));
|
||||
}
|
||||
return mBounds;
|
||||
}
|
|
@ -0,0 +1,70 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* 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 MOZILLA_DOMQUAD_H_
|
||||
#define MOZILLA_DOMQUAD_H_
|
||||
|
||||
#include "nsWrapperCache.h"
|
||||
#include "nsISupports.h"
|
||||
#include "nsCycleCollectionParticipant.h"
|
||||
#include "mozilla/Attributes.h"
|
||||
#include "nsCOMPtr.h"
|
||||
#include "nsAutoPtr.h"
|
||||
#include "mozilla/dom/BindingDeclarations.h"
|
||||
#include "mozilla/ErrorResult.h"
|
||||
#include "Units.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
class DOMRectReadOnly;
|
||||
class DOMPoint;
|
||||
struct DOMPointInit;
|
||||
|
||||
class DOMQuad MOZ_FINAL : public nsWrapperCache
|
||||
{
|
||||
public:
|
||||
DOMQuad(nsISupports* aParent, CSSPoint aPoints[4]);
|
||||
DOMQuad(nsISupports* aParent);
|
||||
~DOMQuad();
|
||||
|
||||
NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(DOMQuad)
|
||||
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(DOMQuad)
|
||||
|
||||
nsISupports* GetParentObject() const { return mParent; }
|
||||
virtual JSObject* WrapObject(JSContext* aCx,
|
||||
JS::Handle<JSObject*> aScope) MOZ_OVERRIDE;
|
||||
|
||||
static already_AddRefed<DOMQuad>
|
||||
Constructor(const GlobalObject& aGlobal,
|
||||
const DOMPointInit& aP1,
|
||||
const DOMPointInit& aP2,
|
||||
const DOMPointInit& aP3,
|
||||
const DOMPointInit& aP4,
|
||||
ErrorResult& aRV);
|
||||
static already_AddRefed<DOMQuad>
|
||||
Constructor(const GlobalObject& aGlobal, const DOMRectReadOnly& aRect,
|
||||
ErrorResult& aRV);
|
||||
|
||||
DOMRectReadOnly* Bounds() const;
|
||||
DOMPoint* P1() const { return mPoints[0]; }
|
||||
DOMPoint* P2() const { return mPoints[1]; }
|
||||
DOMPoint* P3() const { return mPoints[2]; }
|
||||
DOMPoint* P4() const { return mPoints[3]; }
|
||||
|
||||
DOMPoint* Point(uint32_t aIndex) { return mPoints[aIndex]; }
|
||||
|
||||
protected:
|
||||
class QuadBounds;
|
||||
|
||||
nsCOMPtr<nsISupports> mParent;
|
||||
nsRefPtr<DOMPoint> mPoints[4];
|
||||
mutable nsRefPtr<QuadBounds> mBounds; // allocated lazily
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif /*MOZILLA_DOMRECT_H_*/
|
|
@ -61,6 +61,7 @@ EXPORTS.mozilla.dom += [
|
|||
'DOMImplementation.h',
|
||||
'DOMParser.h',
|
||||
'DOMPoint.h',
|
||||
'DOMQuad.h',
|
||||
'DOMRect.h',
|
||||
'DOMStringList.h',
|
||||
'EventSource.h',
|
||||
|
@ -81,6 +82,7 @@ UNIFIED_SOURCES += [
|
|||
'DOMImplementation.cpp',
|
||||
'DOMParser.cpp',
|
||||
'DOMPoint.cpp',
|
||||
'DOMQuad.cpp',
|
||||
'DOMRect.cpp',
|
||||
'DOMStringList.cpp',
|
||||
'Element.cpp',
|
||||
|
|
|
@ -342,6 +342,10 @@ DOMInterfaces = {
|
|||
'headerFile': 'mozilla/dom/DOMRect.h',
|
||||
},
|
||||
|
||||
'DOMQuad': {
|
||||
'resultNotAddRefed': [ 'bounds', 'p0', 'p1', 'p2', 'p3' ]
|
||||
},
|
||||
|
||||
'DOMSettableTokenList': {
|
||||
'nativeType': 'nsDOMSettableTokenList',
|
||||
},
|
||||
|
|
|
@ -309,6 +309,8 @@ var interfaceNamesInGlobalScope =
|
|||
"DOMPoint",
|
||||
// IMPORTANT: Do not change this list without review from a DOM peer!
|
||||
"DOMPointReadOnly",
|
||||
// IMPORTANT: Do not change this list without review from a DOM peer!
|
||||
"DOMQuad",
|
||||
// IMPORTANT: Do not change this list without review from a DOM peer!
|
||||
"DOMRect",
|
||||
// IMPORTANT: Do not change this list without review from a DOM peer!
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* 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/.
|
||||
*
|
||||
* The origin of this IDL file is
|
||||
* http://dev.w3.org/fxtf/geometry/
|
||||
*
|
||||
* Copyright © 2012 W3C® (MIT, ERCIM, Keio), All Rights Reserved. W3C
|
||||
* liability, trademark and document use rules apply.
|
||||
*/
|
||||
|
||||
[Pref="layout.css.DOMQuad.enabled",
|
||||
Constructor(optional DOMPointInit p1, optional DOMPointInit p2,
|
||||
optional DOMPointInit p3, optional DOMPointInit p4),
|
||||
Constructor(DOMRectReadOnly rect)]
|
||||
interface DOMQuad {
|
||||
[SameObject] readonly attribute DOMPoint p1;
|
||||
[SameObject] readonly attribute DOMPoint p2;
|
||||
[SameObject] readonly attribute DOMPoint p3;
|
||||
[SameObject] readonly attribute DOMPoint p4;
|
||||
[SameObject] readonly attribute DOMRectReadOnly bounds;
|
||||
};
|
|
@ -84,6 +84,7 @@ WEBIDL_FILES = [
|
|||
'DOMMMIError.webidl',
|
||||
'DOMParser.webidl',
|
||||
'DOMPoint.webidl',
|
||||
'DOMQuad.webidl',
|
||||
'DOMRect.webidl',
|
||||
'DOMRectList.webidl',
|
||||
'DOMRequest.webidl',
|
||||
|
|
|
@ -1813,6 +1813,9 @@ pref("layout.css.will-change.enabled", false);
|
|||
// Is support for DOMPoint enabled?
|
||||
pref("layout.css.DOMPoint.enabled", true);
|
||||
|
||||
// Is support for DOMQuad enabled?
|
||||
pref("layout.css.DOMQuad.enabled", true);
|
||||
|
||||
// Is support for CSS "text-align: true X" enabled?
|
||||
pref("layout.css.text-align-true-value.enabled", false);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче