зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1767127 - Change the types of FilterInstance::m[UserSpaceToFilter|FilterSpaceToUser]SpaceScale to MatrixScalesDouble. r=botond
Differential Revision: https://phabricator.services.mozilla.com/D148138
This commit is contained in:
Родитель
50fea61916
Коммит
f0ceea18e4
|
@ -14,6 +14,7 @@
|
|||
|
||||
#include "mozilla/Assertions.h"
|
||||
#include "mozilla/FloatingPoint.h"
|
||||
#include "mozilla/gfx/ScaleFactors2D.h"
|
||||
#include "Types.h"
|
||||
|
||||
namespace mozilla {
|
||||
|
@ -584,6 +585,11 @@ struct BaseRect {
|
|||
height = y1 - y0;
|
||||
}
|
||||
|
||||
// Scale 'this' by aScale.xScale and aScale.yScale without doing any rounding.
|
||||
template <class Src, class Dst>
|
||||
void Scale(const BaseScaleFactors2D<Src, Dst, T>& aScale) {
|
||||
Scale(aScale.xScale, aScale.yScale);
|
||||
}
|
||||
// Scale 'this' by aScale without doing any rounding.
|
||||
void Scale(T aScale) { Scale(aScale, aScale); }
|
||||
// Scale 'this' by aXScale and aYScale, without doing any rounding.
|
||||
|
|
|
@ -484,8 +484,8 @@ FilterInstance::FilterInstance(
|
|||
}
|
||||
|
||||
// Get various transforms:
|
||||
gfxMatrix filterToUserSpace(mFilterSpaceToUserSpaceScale.width, 0.0f, 0.0f,
|
||||
mFilterSpaceToUserSpaceScale.height, 0.0f, 0.0f);
|
||||
gfxMatrix filterToUserSpace(mFilterSpaceToUserSpaceScale.xScale, 0.0f, 0.0f,
|
||||
mFilterSpaceToUserSpaceScale.yScale, 0.0f, 0.0f);
|
||||
|
||||
mFilterSpaceToFrameSpaceInCSSPxTransform =
|
||||
filterToUserSpace * GetUserSpaceToFrameSpaceInCSSPxTransform();
|
||||
|
@ -526,19 +526,19 @@ bool FilterInstance::ComputeTargetBBoxInFilterSpace() {
|
|||
|
||||
bool FilterInstance::ComputeUserSpaceToFilterSpaceScale() {
|
||||
if (mTargetFrame) {
|
||||
mUserSpaceToFilterSpaceScale = mPaintTransform.ScaleFactors().ToSize();
|
||||
if (mUserSpaceToFilterSpaceScale.width <= 0.0f ||
|
||||
mUserSpaceToFilterSpaceScale.height <= 0.0f) {
|
||||
mUserSpaceToFilterSpaceScale = mPaintTransform.ScaleFactors();
|
||||
if (mUserSpaceToFilterSpaceScale.xScale <= 0.0f ||
|
||||
mUserSpaceToFilterSpaceScale.yScale <= 0.0f) {
|
||||
// Nothing should be rendered.
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
mUserSpaceToFilterSpaceScale = gfxSize(1.0, 1.0);
|
||||
mUserSpaceToFilterSpaceScale = MatrixScalesDouble();
|
||||
}
|
||||
|
||||
mFilterSpaceToUserSpaceScale =
|
||||
gfxSize(1.0f / mUserSpaceToFilterSpaceScale.width,
|
||||
1.0f / mUserSpaceToFilterSpaceScale.height);
|
||||
MatrixScalesDouble(1.0f / mUserSpaceToFilterSpaceScale.xScale,
|
||||
1.0f / mUserSpaceToFilterSpaceScale.yScale);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -546,16 +546,14 @@ bool FilterInstance::ComputeUserSpaceToFilterSpaceScale() {
|
|||
gfxRect FilterInstance::UserSpaceToFilterSpace(
|
||||
const gfxRect& aUserSpaceRect) const {
|
||||
gfxRect filterSpaceRect = aUserSpaceRect;
|
||||
filterSpaceRect.Scale(mUserSpaceToFilterSpaceScale.width,
|
||||
mUserSpaceToFilterSpaceScale.height);
|
||||
filterSpaceRect.Scale(mUserSpaceToFilterSpaceScale);
|
||||
return filterSpaceRect;
|
||||
}
|
||||
|
||||
gfxRect FilterInstance::FilterSpaceToUserSpace(
|
||||
const gfxRect& aFilterSpaceRect) const {
|
||||
gfxRect userSpaceRect = aFilterSpaceRect;
|
||||
userSpaceRect.Scale(mFilterSpaceToUserSpaceScale.width,
|
||||
mFilterSpaceToUserSpaceScale.height);
|
||||
userSpaceRect.Scale(mFilterSpaceToUserSpaceScale);
|
||||
return userSpaceRect;
|
||||
}
|
||||
|
||||
|
@ -583,8 +581,8 @@ nsresult FilterInstance::BuildPrimitives(Span<const StyleFilter> aFilterChain,
|
|||
nsresult FilterInstance::BuildPrimitivesForFilter(
|
||||
const StyleFilter& aFilter, nsIFrame* aTargetFrame, bool aInputIsTainted,
|
||||
nsTArray<FilterPrimitiveDescription>& aPrimitiveDescriptions) {
|
||||
NS_ASSERTION(mUserSpaceToFilterSpaceScale.width > 0.0f &&
|
||||
mFilterSpaceToUserSpaceScale.height > 0.0f,
|
||||
NS_ASSERTION(mUserSpaceToFilterSpaceScale.xScale > 0.0f &&
|
||||
mFilterSpaceToUserSpaceScale.yScale > 0.0f,
|
||||
"scale factors between spaces should be positive values");
|
||||
|
||||
if (aFilter.IsUrl()) {
|
||||
|
|
|
@ -367,8 +367,8 @@ class FilterInstance {
|
|||
/**
|
||||
* The scale factors between user space and filter space.
|
||||
*/
|
||||
gfxSize mUserSpaceToFilterSpaceScale;
|
||||
gfxSize mFilterSpaceToUserSpaceScale;
|
||||
gfx::MatrixScalesDouble mUserSpaceToFilterSpaceScale;
|
||||
gfx::MatrixScalesDouble mFilterSpaceToUserSpaceScale;
|
||||
|
||||
/**
|
||||
* Pre-filter paint bounds of the element that is being filtered, in filter
|
||||
|
|
|
@ -32,7 +32,8 @@ namespace mozilla {
|
|||
SVGFilterInstance::SVGFilterInstance(
|
||||
const StyleFilter& aFilter, nsIFrame* aTargetFrame,
|
||||
nsIContent* aTargetContent, const UserSpaceMetrics& aMetrics,
|
||||
const gfxRect& aTargetBBox, const gfxSize& aUserSpaceToFilterSpaceScale)
|
||||
const gfxRect& aTargetBBox,
|
||||
const MatrixScalesDouble& aUserSpaceToFilterSpaceScale)
|
||||
: mFilter(aFilter),
|
||||
mTargetContent(aTargetContent),
|
||||
mMetrics(aMetrics),
|
||||
|
@ -178,14 +179,14 @@ float SVGFilterInstance::GetPrimitiveNumber(uint8_t aCtxType,
|
|||
|
||||
switch (aCtxType) {
|
||||
case SVGContentUtils::X:
|
||||
return value * mUserSpaceToFilterSpaceScale.width;
|
||||
return value * static_cast<float>(mUserSpaceToFilterSpaceScale.xScale);
|
||||
case SVGContentUtils::Y:
|
||||
return value * mUserSpaceToFilterSpaceScale.height;
|
||||
return value * static_cast<float>(mUserSpaceToFilterSpaceScale.yScale);
|
||||
case SVGContentUtils::XY:
|
||||
default:
|
||||
return value * SVGContentUtils::ComputeNormalizedHypotenuse(
|
||||
mUserSpaceToFilterSpaceScale.width,
|
||||
mUserSpaceToFilterSpaceScale.height);
|
||||
mUserSpaceToFilterSpaceScale.xScale,
|
||||
mUserSpaceToFilterSpaceScale.yScale);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -210,8 +211,7 @@ Point3D SVGFilterInstance::ConvertLocation(const Point3D& aPoint) const {
|
|||
gfxRect SVGFilterInstance::UserSpaceToFilterSpace(
|
||||
const gfxRect& aUserSpaceRect) const {
|
||||
gfxRect filterSpaceRect = aUserSpaceRect;
|
||||
filterSpaceRect.Scale(mUserSpaceToFilterSpaceScale.width,
|
||||
mUserSpaceToFilterSpaceScale.height);
|
||||
filterSpaceRect.Scale(mUserSpaceToFilterSpaceScale);
|
||||
return filterSpaceRect;
|
||||
}
|
||||
|
||||
|
|
|
@ -79,11 +79,11 @@ class SVGFilterInstance {
|
|||
* @param aTargetBBox The SVG bbox to use for the target frame, computed by
|
||||
* the caller. The caller may decide to override the actual SVG bbox.
|
||||
*/
|
||||
SVGFilterInstance(const StyleFilter& aFilter, nsIFrame* aTargetFrame,
|
||||
nsIContent* aTargetContent,
|
||||
const UserSpaceMetrics& aMetrics,
|
||||
const gfxRect& aTargetBBox,
|
||||
const gfxSize& aUserSpaceToFilterSpaceScale);
|
||||
SVGFilterInstance(
|
||||
const StyleFilter& aFilter, nsIFrame* aTargetFrame,
|
||||
nsIContent* aTargetContent, const UserSpaceMetrics& aMetrics,
|
||||
const gfxRect& aTargetBBox,
|
||||
const gfx::MatrixScalesDouble& aUserSpaceToFilterSpaceScale);
|
||||
|
||||
/**
|
||||
* Returns true if the filter instance was created successfully.
|
||||
|
@ -233,7 +233,7 @@ class SVGFilterInstance {
|
|||
/**
|
||||
* The scale factors between user space and filter space.
|
||||
*/
|
||||
gfxSize mUserSpaceToFilterSpaceScale;
|
||||
gfx::MatrixScalesDouble mUserSpaceToFilterSpaceScale;
|
||||
|
||||
/**
|
||||
* The 'primitiveUnits' attribute value (objectBoundingBox or userSpaceOnUse).
|
||||
|
|
Загрузка…
Ссылка в новой задаче