Bug 1203376 - Honor filter region settings for lighting filters. r=mstange

--HG--
extra : rebase_source : adecead97d734b9bb9b5b104b88edf81c82a13a4
This commit is contained in:
Tom Klein 2015-10-07 08:25:00 +02:00
Родитель faf361396a
Коммит 7893b08d5b
8 изменённых файлов: 85 добавлений и 9 удалений

Просмотреть файл

@ -536,6 +536,27 @@ IsTransferFilterType(FilterType aType)
}
}
static bool
HasUnboundedOutputRegion(FilterType aType)
{
if (IsTransferFilterType(aType)) {
return true;
}
switch (aType) {
case FilterType::COLOR_MATRIX:
case FilterType::POINT_DIFFUSE:
case FilterType::SPOT_DIFFUSE:
case FilterType::DISTANT_DIFFUSE:
case FilterType::POINT_SPECULAR:
case FilterType::SPOT_SPECULAR:
case FilterType::DISTANT_SPECULAR:
return true;
default:
return false;
}
}
/* static */
already_AddRefed<FilterNode>
FilterNodeD2D1::Create(ID2D1DeviceContext *aDC, FilterType aType)
@ -556,7 +577,7 @@ FilterNodeD2D1::Create(ID2D1DeviceContext *aDC, FilterType aType)
RefPtr<FilterNodeD2D1> filter = new FilterNodeD2D1(effect, aType);
if (IsTransferFilterType(aType) || aType == FilterType::COLOR_MATRIX) {
if (HasUnboundedOutputRegion(aType)) {
// These filters can produce non-transparent output from transparent
// input pixels, and we want them to have an unbounded output region.
filter = new FilterNodeExtendInputAdapterD2D1(aDC, filter, aType);

Просмотреть файл

@ -3340,7 +3340,7 @@ template<typename LightType, typename LightingType>
IntRect
FilterNodeLightingSoftware<LightType, LightingType>::GetOutputRectInRect(const IntRect& aRect)
{
return GetInputRectInRect(IN_LIGHTING_IN, aRect);
return aRect;
}
Point3D
@ -3482,7 +3482,7 @@ FilterNodeLightingSoftware<LightType, LightingType>::DoRender(const IntRect& aRe
RefPtr<DataSourceSurface> input =
GetInputDataSourceSurface(IN_LIGHTING_IN, srcRect, CAN_HANDLE_A8,
EDGE_MODE_DUPLICATE);
EDGE_MODE_NONE);
if (!input) {
return nullptr;

Просмотреть файл

@ -1232,9 +1232,6 @@ FilterNodeGraphFromDescription(DrawTarget* aDT,
{
const nsTArray<FilterPrimitiveDescription>& primitives = aFilter.mPrimitives;
Rect resultNeededRect(aResultNeededRect);
resultNeededRect.RoundOut();
RefPtr<FilterCachedColorModels> sourceFilters[4];
nsTArray<RefPtr<FilterCachedColorModels> > primitiveFilters;
@ -1407,6 +1404,9 @@ ResultChangeRegionForPrimitive(const FilterPrimitiveDescription& aDescription,
case PrimitiveType::ConvolveMatrix:
{
if (atts.GetUint(eConvolveMatrixEdgeMode) != EDGE_MODE_NONE) {
return aDescription.PrimitiveSubregion();
}
Size kernelUnitLength = atts.GetSize(eConvolveMatrixKernelUnitLength);
IntSize kernelSize = atts.GetIntSize(eConvolveMatrixKernelSize);
IntPoint target = atts.GetIntPoint(eConvolveMatrixTarget);
@ -1603,6 +1603,8 @@ FilterSupport::PostFilterExtentsForPrimitive(const FilterPrimitiveDescription& a
case PrimitiveType::Turbulence:
case PrimitiveType::Image:
case PrimitiveType::DiffuseLighting:
case PrimitiveType::SpecularLighting:
{
return aDescription.PrimitiveSubregion();
}

Просмотреть файл

@ -437,7 +437,8 @@ public:
/**
* Computes the region that changes in the filter output due to a change in
* input.
* input. This is primarily needed when an individual piece of content inside
* a filtered container element changes.
*/
static nsIntRegion
ComputeResultChangeRegion(const FilterDescription& aFilter,

Просмотреть файл

@ -3,5 +3,14 @@
http://creativecommons.org/publicdomain/zero/1.0/
-->
<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'>
<image width='100' height='100' xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAG6SURBVHhe7d3BbcJAGAXhJYXQg32mCV8p2vRAEb4mREoJe/g2GiTf55/hiRu+jTG+P08fxMAXwhHGn4GCYF+FghQEM4DhtJCCYAYwnBZSEMwAhtNCCoIZwHBaSEEwAxhOCykIZgDDaSEFwQxgOC2kIJgBDGfqQh6Px9j3HTtxLZypQZ7P5ziOYy0DGO3UIPf7fWzbhp24Fs7UIGudbtIWBOtSkIJgBjCcFlIQzACG00IKghnAcFpIQTADGE4LKQhmAMNpIQXBDGA4LaQgmAEMp4UUBDOA4bSQgmAGMJwWUhDMAIbTQgqCGcBwWkhBMAMYTgspCGYAw2khBcEMYDgtpCCYAQynhRQEM4DhtJCCYAYwnBZSEMwAhtNCCoIZwHBaSEEwAxhOCykIZgDDaSEFwQxgOC2kIJgBDKeFFAQzgOG0kIJgBjCcFlIQzACG00IKghnAcFrIfw7yfr/H6/XCTlwL5/bBnfY+9d8/47+ua5znuZYFiHZqEOiuZVH6DcHSFaQgmAEMp4UUBDOA4bSQgmAGMJwWUhDMAIbTQgqCGcBwWkhBMAMYTgspCGYAw2khBcEMYDgtBAvyA+wPEw79WuphAAAAAElFTkSuQmCC"/>
<image width='100' height='100'
xlink:href="data:image/png;base64,
iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAABmJLR0QA/wD/AP+gvaeTAAAACXBI
WXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH3wkbDDIilL5aRAAAAB1pVFh0Q29tbWVudAAAAAAAQ3Jl
YXRlZCB3aXRoIEdJTVBkLmUHAAAA9UlEQVR42u3csRHDIBBFwbPHddADiqmEduhFlSiWelBOSirX
YFsB49lXAMHf4DIeEXGFpqi1Fk8zzFPOGchsAQEiIEAEBIiAABEQIAIiIEAEBIiAAPmgUkosy2LV
H3rd+VitNXrvse+7ZWcASSlFSsmqbggQAQEiIAICRECACAgQAQEiIEAERECACAgQAQEiIEAERECA
CAgQAQEiIEAERECACAgQAQEiIEAERECACAgQAQEiIEAERECACAgQAfnHbv3Z+jzP6L1bdRaQdV1j
jGHVWUC2bbOoGwJEQIAIiIAAERAgAgJEQIAIiIAAERAg+qrjOOINBcEbJFN4kugAAAAASUVORK5C
YII="/>
</svg>

До

Ширина:  |  Высота:  |  Размер: 1013 B

После

Ширина:  |  Высота:  |  Размер: 834 B

Просмотреть файл

@ -0,0 +1,11 @@
<!--
Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/
-->
<svg xmlns="http://www.w3.org/2000/svg" width="600px" height="300px">
<rect x="50" y="50" width="200" height="200" fill="black" />
<rect x="340" y="40" width="220" height="220" fill="grey" />
<rect x="350" y="50" width="200" height="200" fill="white" />
</svg>

После

Ширина:  |  Высота:  |  Размер: 387 B

Просмотреть файл

@ -0,0 +1,30 @@
<!--
Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/
-->
<svg xmlns="http://www.w3.org/2000/svg" width="600px" height="300px">
<!-- From https://bugzilla.mozilla.org/show_bug.cgi?id=1203376 -->
<defs>
<!-- the filter lights are intentionally chosen to fill the entire area with
a solid color since we're only testing the extents of the filter region
-->
<filter id="diffuse" x="-50%" y="-50%" width="200%" height="200%">
<!-- gives a black filter region -->
<feDiffuseLighting lighting-color="black">
<feDistantLight />
</feDiffuseLighting>
</filter>
<filter id="specular" x="-50%" y="-50%" width="200%" height="200%">
<!-- gives a white filter region -->
<feSpecularLighting lighting-color="white" specularConstant="100">
<feDistantLight elevation="90"/>
</feSpecularLighting>
</filter>
</defs>
<rect x="100" y="100" width="100" height="100" filter="url(#diffuse)" />
<rect x="340" y="40" width="220" height="220" fill="grey" />
<rect x="400" y="100" width="100" height="100" filter="url(#specular)" />
</svg>

После

Ширина:  |  Высота:  |  Размер: 1.1 KiB

Просмотреть файл

@ -109,10 +109,12 @@ fuzzy(2,500) == feDisplacementMap-colour-01.svg feDisplacementMap-colour-01-ref.
== feTile-large-02.svg feTile-large-02-ref.svg
== feTile-outside-01.svg feTile-outside-01-ref.svg
fuzzy(1,119) == feDiffuseLighting-1.svg feDiffuseLighting-1-ref.svg
fuzzy(1,217) == feDiffuseLighting-1.svg feDiffuseLighting-1-ref.svg
fuzzy(2,2659) skip-if(d2d) == feSpecularLighting-1.svg feSpecularLighting-1-ref.svg
== filter-lighting-region.svg filter-lighting-region-ref.svg
== fePointLight-zoomed-page.svg fePointLight-zoomed-page-ref.svg
== feTurbulence-offset.svg feTurbulence-offset-ref.svg