Commit fe81d6fa authored by Julie Jeongeun Kim's avatar Julie Jeongeun Kim Committed by Commit Bot

Update negative value handling on FETurbulence::CreateImageFilter

This CL updates how to handle negative values for baseFrequency
on <feTurbulence>. As the spec[1] says, it should leave it
unsupported, which means it's treated as if they hadn't been
specified when rendering.

[1]https://drafts.fxtf.org/filter-effects/#element-attrdef-feturbulence-basefrequency

Bug: 1068863
Change-Id: I6799cb26b6997f1b4d7afc9f5222a209064a30b1
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2141485Reviewed-by: default avatarFredrik Söderquist <fs@opera.com>
Reviewed-by: default avatarPhilip Rogers <pdr@chromium.org>
Commit-Queue: Julie Kim <jkim@igalia.com>
Cr-Commit-Position: refs/heads/master@{#758465}
parent df552306
...@@ -114,8 +114,14 @@ bool FETurbulence::SetStitchTiles(bool stitch) { ...@@ -114,8 +114,14 @@ bool FETurbulence::SetStitchTiles(bool stitch) {
} }
sk_sp<PaintFilter> FETurbulence::CreateImageFilter() { sk_sp<PaintFilter> FETurbulence::CreateImageFilter() {
if (base_frequency_x_ < 0 || base_frequency_y_ < 0) float base_frequency_x = base_frequency_x_;
return CreateTransparentBlack(); float base_frequency_y = base_frequency_y_;
if (base_frequency_x < 0 || base_frequency_y < 0) {
// Negative values are unsupported which means it should be treated as
// if they hadn't been specified. So, it implies "0 0"(the initial
// value).
base_frequency_x = base_frequency_y = 0;
}
PaintFilter::CropRect rect = GetCropRect(); PaintFilter::CropRect rect = GetCropRect();
TurbulencePaintFilter::TurbulenceType type = TurbulencePaintFilter::TurbulenceType type =
...@@ -129,8 +135,8 @@ sk_sp<PaintFilter> FETurbulence::CreateImageFilter() { ...@@ -129,8 +135,8 @@ sk_sp<PaintFilter> FETurbulence::CreateImageFilter() {
// and not the target bounding box scale (as SVGFilter::apply*Scale() // and not the target bounding box scale (as SVGFilter::apply*Scale()
// would do). Note also that we divide by the scale since this is // would do). Note also that we divide by the scale since this is
// a frequency, not a period. // a frequency, not a period.
float base_frequency_x = base_frequency_x_ / GetFilter()->Scale(); base_frequency_x /= GetFilter()->Scale();
float base_frequency_y = base_frequency_y_ / GetFilter()->Scale(); base_frequency_y /= GetFilter()->Scale();
// Cap the number of octaves to the maximum detectable when rendered with // Cap the number of octaves to the maximum detectable when rendered with
// 8 bits per pixel, plus one for higher bit depth. // 8 bits per pixel, plus one for higher bit depth.
......
...@@ -15,22 +15,32 @@ ...@@ -15,22 +15,32 @@
<!-- type=fractalNoise --> <!-- type=fractalNoise -->
<filter id="fn1" x="0" y="0" width="1" height="1"> <filter id="fn1" x="0" y="0" width="1" height="1">
<feTurbulence type="fractalNoise" baseFrequency="-1 1"/> <feTurbulence type="fractalNoise" baseFrequency="-1 1"/>
<feColorMatrix values="1 0 0 0 0, 0 1 0 0 0.5, 0 0 1 0 0, 0 0 0 1 1"/> <feComponentTransfer>
<feFuncR type="discrete" tableValues="1 0 1"/>
<feFuncG type="discrete" tableValues="0 0.502 0"/> <!-- map [0..1/3] -> 0; [1/3...2/3] -> 0.502; [2/3..1] -> 0 -->
<feFuncB type="discrete" tableValues="0"/>
<feFuncA type="discrete" tableValues="0 1 0"/>
</feComponentTransfer>
</filter> </filter>
<filter id="fn2" x="0" y="0" width="1" height="1"> <filter id="fn2" x="0" y="0" width="1" height="1">
<feTurbulence type="fractalNoise" baseFrequency="1 -1"/> <feTurbulence type="fractalNoise" baseFrequency="1 -1"/>
<feColorMatrix values="1 0 0 0 0, 0 1 0 0 0.5, 0 0 1 0 0, 0 0 0 1 1"/> <feComponentTransfer>
<feFuncR type="discrete" tableValues="1 0 1"/>
<feFuncG type="discrete" tableValues="0 0.502 0"/> <!-- map [0..1/3] -> 0; [1/3...2/3] -> 0.502; [2/3..1] -> 0 -->
<feFuncB type="discrete" tableValues="0"/>
<feFuncA type="discrete" tableValues="0 1 0"/>
</feComponentTransfer>
</filter> </filter>
<!-- type=turbulence --> <!-- type=turbulence -->
<filter id="tb1" x="0" y="0" width="1" height="1"> <filter id="tb1" x="0" y="0" width="1" height="1">
<feTurbulence type="fractalNoise" baseFrequency="-1 1"/> <feTurbulence type="turbulence" baseFrequency="-1 1"/>
<feColorMatrix values="1 0 0 0 0, 0 1 0 0 0.5, 0 0 1 0 0, 0 0 0 1 1"/> <feColorMatrix values="1 0 0 0 0, 0 1 0 0 0.502, 0 0 1 0 0, 0 0 0 1 1"/>
</filter> </filter>
<filter id="tb2" x="0" y="0" width="1" height="1"> <filter id="tb2" x="0" y="0" width="1" height="1">
<feTurbulence type="fractalNoise" baseFrequency="1 -1"/> <feTurbulence type="turbulence" baseFrequency="1 -1"/>
<feColorMatrix values="1 0 0 0 0, 0 1 0 0 0.5, 0 0 1 0 0, 0 0 0 1 1"/> <feColorMatrix values="1 0 0 0 0, 0 1 0 0 0.502, 0 0 1 0 0, 0 0 0 1 1"/>
</filter> </filter>
</svg> </svg>
...@@ -3,26 +3,36 @@ ...@@ -3,26 +3,36 @@
<!-- type=fractalNoise --> <!-- type=fractalNoise -->
<filter id="fn1" x="0" y="0" width="1" height="1"> <filter id="fn1" x="0" y="0" width="1" height="1">
<feTurbulence type="fractalNoise" baseFrequency="-1 1"/> <feTurbulence type="fractalNoise" baseFrequency="-1 1"/>
<feColorMatrix values="1 0 0 0 0, 0 1 0 0 0.5, 0 0 1 0 0, 0 0 0 1 1"/> <feComponentTransfer>
<feFuncR type="discrete" tableValues="1 0 1"/>
<feFuncG type="discrete" tableValues="0 0.502 0"/> <!-- map [0..1/3] -> 0; [1/3...2/3] -> 0.502; [2/3..1] -> 0 -->
<feFuncB type="discrete" tableValues="0"/>
<feFuncA type="discrete" tableValues="0 1 0"/>
</feComponentTransfer>
</filter> </filter>
<rect width="100" height="100" filter="url(#fn1)"/> <rect width="100" height="100" filter="url(#fn1)"/>
<filter id="fn2" x="0" y="0" width="1" height="1"> <filter id="fn2" x="0" y="0" width="1" height="1">
<feTurbulence type="fractalNoise" baseFrequency="1 -1"/> <feTurbulence type="fractalNoise" baseFrequency="1 -1"/>
<feColorMatrix values="1 0 0 0 0, 0 1 0 0 0.5, 0 0 1 0 0, 0 0 0 1 1"/> <feComponentTransfer>
<feFuncR type="discrete" tableValues="1 0 1"/>
<feFuncG type="discrete" tableValues="0 0.502 0"/> <!-- map [0..1/3] -> 0; [1/3...2/3] -> 0.502; [2/3..1] -> 0 -->
<feFuncB type="discrete" tableValues="0"/>
<feFuncA type="discrete" tableValues="0 1 0"/>
</feComponentTransfer>
</filter> </filter>
<rect width="100" height="100" filter="url(#fn2)" x="100"/> <rect width="100" height="100" filter="url(#fn2)" x="100"/>
<!-- type=turbulence --> <!-- type=turbulence -->
<filter id="tb1" x="0" y="0" width="1" height="1"> <filter id="tb1" x="0" y="0" width="1" height="1">
<feTurbulence type="turbulence" baseFrequency="-1 1"/> <feTurbulence type="turbulence" baseFrequency="-1 1"/>
<feColorMatrix values="1 0 0 0 0, 0 1 0 0 0.5, 0 0 1 0 0, 0 0 0 1 1"/> <feColorMatrix values="1 0 0 0 0, 0 1 0 0 0.502, 0 0 1 0 0, 0 0 0 1 1"/>
</filter> </filter>
<rect width="100" height="100" filter="url(#tb1)" x="200"/> <rect width="100" height="100" filter="url(#tb1)" x="200"/>
<filter id="tb2" x="0" y="0" width="1" height="1"> <filter id="tb2" x="0" y="0" width="1" height="1">
<feTurbulence type="turbulence" baseFrequency="1 -1"/> <feTurbulence type="turbulence" baseFrequency="1 -1"/>
<feColorMatrix values="1 0 0 0 0, 0 1 0 0 0.5, 0 0 1 0 0, 0 0 0 1 1"/> <feColorMatrix values="1 0 0 0 0, 0 1 0 0 0.502, 0 0 1 0 0, 0 0 0 1 1"/>
</filter> </filter>
<rect width="100" height="100" filter="url(#tb2)" x="300"/> <rect width="100" height="100" filter="url(#tb2)" x="300"/>
</svg> </svg>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment