Bug 1680669 - part 2: Make point of CSSPixel and LayoutDevicePixel work within double coordinates r=botond

`MouseEvent` and its subclasses need to treat screen/client coordinates with
`double` variables.  Although for the backward compatibility, we'll keep
rounding the value to integer, but we need to support lossless untrusted
event creation.  Therefore, they need to store the points with the new point
types.

Differential Revision: https://phabricator.services.mozilla.com/D222724
This commit is contained in:
Masayuki Nakano
2024-12-03 07:09:44 +00:00
parent e839d2fe6b
commit 2432b72a37
3 changed files with 70 additions and 21 deletions

View File

@@ -85,23 +85,37 @@ struct MOZ_EMPTY_BASES IntPointTyped
return IntPointTyped(int32_t(floorf(aX + 0.5f)),
int32_t(floorf(aY + 0.5f)));
}
static IntPointTyped Round(double aX, double aY) {
return IntPointTyped(int32_t(floor(aX + 0.5)), int32_t(floor(aY + 0.5)));
}
static IntPointTyped Ceil(float aX, float aY) {
return IntPointTyped(int32_t(ceilf(aX)), int32_t(ceilf(aY)));
}
static IntPointTyped Ceil(double aX, double aY) {
return IntPointTyped(int32_t(ceil(aX)), int32_t(ceil(aY)));
}
static IntPointTyped Floor(float aX, float aY) {
return IntPointTyped(int32_t(floorf(aX)), int32_t(floorf(aY)));
}
static IntPointTyped Floor(double aX, double aY) {
return IntPointTyped(int32_t(floor(aX)), int32_t(floor(aY)));
}
static IntPointTyped Truncate(float aX, float aY) {
template <typename F>
static IntPointTyped Truncate(F aX, F aY) {
return IntPointTyped(int32_t(aX), int32_t(aY));
}
static IntPointTyped Round(const PointTyped<Units, float>& aPoint);
static IntPointTyped Ceil(const PointTyped<Units, float>& aPoint);
static IntPointTyped Floor(const PointTyped<Units, float>& aPoint);
static IntPointTyped Truncate(const PointTyped<Units, float>& aPoint);
template <typename F>
static IntPointTyped Round(const PointTyped<Units, F>& aPoint);
template <typename F>
static IntPointTyped Ceil(const PointTyped<Units, F>& aPoint);
template <typename F>
static IntPointTyped Floor(const PointTyped<Units, F>& aPoint);
template <typename F>
static IntPointTyped Truncate(const PointTyped<Units, F>& aPoint);
// XXX When all of the code is ported, the following functions to convert to
// and from unknown types should be removed.
@@ -165,13 +179,13 @@ struct MOZ_EMPTY_BASES PointTyped
typedef PointTyped<UnknownUnits> Point;
typedef PointTyped<UnknownUnits, double> PointDouble;
template <class Units>
IntPointTyped<Units> RoundedToInt(const PointTyped<Units>& aPoint) {
template <class Units, class F>
IntPointTyped<Units> RoundedToInt(const PointTyped<Units, F>& aPoint) {
return IntPointTyped<Units>::Round(aPoint.x, aPoint.y);
}
template <class Units>
IntPointTyped<Units> TruncatedToInt(const PointTyped<Units>& aPoint) {
template <class Units, class F>
IntPointTyped<Units> TruncatedToInt(const PointTyped<Units, F>& aPoint) {
return IntPointTyped<Units>::Truncate(aPoint.x, aPoint.y);
}
@@ -204,26 +218,30 @@ typedef Point3DTyped<UnknownUnits> Point3D;
typedef Point3DTyped<UnknownUnits, double> PointDouble3D;
template <typename Units>
template <typename F>
IntPointTyped<Units> IntPointTyped<Units>::Round(
const PointTyped<Units, float>& aPoint) {
const PointTyped<Units, F>& aPoint) {
return IntPointTyped::Round(aPoint.x, aPoint.y);
}
template <typename Units>
template <typename F>
IntPointTyped<Units> IntPointTyped<Units>::Ceil(
const PointTyped<Units, float>& aPoint) {
const PointTyped<Units, F>& aPoint) {
return IntPointTyped::Ceil(aPoint.x, aPoint.y);
}
template <typename Units>
template <typename F>
IntPointTyped<Units> IntPointTyped<Units>::Floor(
const PointTyped<Units, float>& aPoint) {
const PointTyped<Units, F>& aPoint) {
return IntPointTyped::Floor(aPoint.x, aPoint.y);
}
template <typename Units>
template <typename F>
IntPointTyped<Units> IntPointTyped<Units>::Truncate(
const PointTyped<Units, float>& aPoint) {
const PointTyped<Units, F>& aPoint) {
return IntPointTyped::Truncate(aPoint.x, aPoint.y);
}

View File

@@ -319,6 +319,11 @@ inline nscoord NSFloatPixelsToAppUnits(float aPixels, float aAppUnitsPerPixel) {
return NSToCoordRoundWithClamp(aPixels * aAppUnitsPerPixel);
}
inline nscoord NSDoublePixelsToAppUnits(double aPixels,
double aAppUnitsPerPixel) {
return NSToCoordRoundWithClamp(aPixels * aAppUnitsPerPixel);
}
inline nscoord NSIntPixelsToAppUnits(int32_t aPixels,
int32_t aAppUnitsPerPixel) {
// The cast to nscoord makes sure we don't overflow if we ever change

View File

@@ -63,6 +63,7 @@ struct IsPixel<ExternalPixel> : std::true_type {};
typedef gfx::CoordTyped<CSSPixel> CSSCoord;
typedef gfx::IntCoordTyped<CSSPixel> CSSIntCoord;
typedef gfx::PointTyped<CSSPixel, double> CSSDoublePoint;
typedef gfx::PointTyped<CSSPixel> CSSPoint;
typedef gfx::IntPointTyped<CSSPixel> CSSIntPoint;
typedef gfx::SizeTyped<CSSPixel> CSSSize;
@@ -85,8 +86,10 @@ typedef gfx::MarginTyped<OuterCSSPixel> OuterCSSMargin;
typedef gfx::IntMarginTyped<OuterCSSPixel> OuterCSSIntMargin;
typedef gfx::IntRegionTyped<OuterCSSPixel> OuterCSSIntRegion;
typedef gfx::CoordTyped<LayoutDevicePixel, double> LayoutDeviceDoubleCoord;
typedef gfx::CoordTyped<LayoutDevicePixel> LayoutDeviceCoord;
typedef gfx::IntCoordTyped<LayoutDevicePixel> LayoutDeviceIntCoord;
typedef gfx::PointTyped<LayoutDevicePixel, double> LayoutDeviceDoublePoint;
typedef gfx::PointTyped<LayoutDevicePixel> LayoutDevicePoint;
typedef gfx::IntPointTyped<LayoutDevicePixel> LayoutDeviceIntPoint;
typedef gfx::SizeTyped<LayoutDevicePixel> LayoutDeviceSize;
@@ -548,12 +551,33 @@ struct LayoutDevicePixel {
return ToAppUnits(LayoutDeviceCoord(aCoord), aAppUnitsPerDevPixel);
}
static nscoord ToAppUnits(double aCoord, nscoord aAppUnitsPerDevPixel) {
return ToAppUnits(LayoutDeviceDoubleCoord(aCoord), aAppUnitsPerDevPixel);
}
static nscoord ToAppUnits(LayoutDeviceDoubleCoord aCoord,
nscoord aAppUnitsPerDevPixel) {
return NSDoublePixelsToAppUnits(aCoord, aAppUnitsPerDevPixel);
}
static nsPoint ToAppUnits(const LayoutDeviceIntPoint& aPoint,
nscoord aAppUnitsPerDevPixel) {
return nsPoint(ToAppUnits(aPoint.x, aAppUnitsPerDevPixel),
ToAppUnits(aPoint.y, aAppUnitsPerDevPixel));
}
static nsPoint ToAppUnits(const LayoutDevicePoint& aPoint,
nscoord aAppUnitsPerDevPixel) {
return nsPoint(ToAppUnits(aPoint.x, aAppUnitsPerDevPixel),
ToAppUnits(aPoint.y, aAppUnitsPerDevPixel));
}
static nsPoint ToAppUnits(const LayoutDeviceDoublePoint& aPoint,
nscoord aAppUnitsPerDevPixel) {
return nsPoint(ToAppUnits(aPoint.x, aAppUnitsPerDevPixel),
ToAppUnits(aPoint.y, aAppUnitsPerDevPixel));
}
static nsSize ToAppUnits(const LayoutDeviceIntSize& aSize,
nscoord aAppUnitsPerDevPixel) {
return nsSize(ToAppUnits(aSize.width, aAppUnitsPerDevPixel),
@@ -692,16 +716,18 @@ gfx::CoordTyped<Dst> operator/(const gfx::CoordTyped<Src>& aCoord,
return gfx::CoordTyped<Dst>(aCoord.value / aScale.scale);
}
template <class Src, class Dst>
gfx::PointTyped<Dst> operator*(const gfx::PointTyped<Src>& aPoint,
const gfx::ScaleFactor<Src, Dst>& aScale) {
return gfx::PointTyped<Dst>(aPoint.x * aScale.scale, aPoint.y * aScale.scale);
template <class Src, class Dst, class F>
gfx::PointTyped<Dst, F> operator*(const gfx::PointTyped<Src, F>& aPoint,
const gfx::ScaleFactor<Src, Dst>& aScale) {
return gfx::PointTyped<Dst, F>(aPoint.x * aScale.scale,
aPoint.y * aScale.scale);
}
template <class Src, class Dst>
gfx::PointTyped<Dst> operator/(const gfx::PointTyped<Src>& aPoint,
const gfx::ScaleFactor<Dst, Src>& aScale) {
return gfx::PointTyped<Dst>(aPoint.x / aScale.scale, aPoint.y / aScale.scale);
template <class Src, class Dst, class F>
gfx::PointTyped<Dst, F> operator/(const gfx::PointTyped<Src, F>& aPoint,
const gfx::ScaleFactor<Dst, Src>& aScale) {
return gfx::PointTyped<Dst, F>(aPoint.x / aScale.scale,
aPoint.y / aScale.scale);
}
template <class Src, class Dst, class F>