FEATURE: Adds animated? support for webp and avif images

This commit is contained in:
Rafael dos Santos Silva 2023-05-22 17:26:20 -03:00
parent b65d75c8a3
commit 5528ef98d4
No known key found for this signature in database
GPG Key ID: 5E50360227B34938
4 changed files with 29 additions and 1 deletions

View File

@ -435,7 +435,7 @@ class FastImage
def parse_animated
@type = parse_type unless @type
@type == :gif ? send("parse_animated_for_#{@type}") : nil
%i(gif webp avif).include?(@type) ? send("parse_animated_for_#{@type}") : nil
end
def fetch_using_base64(uri)
@ -551,6 +551,8 @@ class FastImage
case @stream.peek(12)[4..-1]
when "ftypavif"
:avif
when "ftypavis"
:avif
when "ftypheic"
:heic
when "ftypmif1"
@ -1092,4 +1094,24 @@ class FastImage
gif = Gif.new(@stream)
gif.animated?
end
def parse_animated_for_webp
vp8 = @stream.read(16)[12..15]
_len = @stream.read(4).unpack("V")
case vp8
when "VP8 "
false
when "VP8L"
false
when "VP8X"
flags = @stream.read(4).unpack("C")[0]
flags & 2 > 0
else
nil
end
end
def parse_animated_for_avif
@stream.peek(12)[4..-1] == "ftypavis"
end
end

BIN
test/fixtures/avif/red_green_flash.avif vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
test/fixtures/webp_animated.webp vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

View File

@ -34,6 +34,7 @@ GoodFixtures = {
"webp_vp8x.webp" => [:webp, [386, 395]],
"webp_vp8l.webp" => [:webp, [386, 395]],
"webp_vp8.webp" => [:webp, [550, 368]],
"webp_animated.webp" => [:webp, [1280, 531]],
"test.svg" => [:svg, [200, 300]],
"test_partial_viewport.svg" => [:svg, [860, 400]],
"test2.svg" => [:svg, [366, 271]],
@ -53,6 +54,7 @@ GoodFixtures = {
"avif/hato.avif" => [:avif, [3082, 2048]],
"avif/fox.avif" => [:avif, [1204, 799]],
"avif/kimono.avif" => [:avif, [722, 1024]],
"avif/red_green_flash.avif" => [:avif, [256, 256]],
}
BadFixtures = [
@ -124,6 +126,10 @@ class FastImageTest < Test::Unit::TestCase
assert_equal false, FastImage.animated?(TestUrl + "test.gif")
assert_equal true, FastImage.animated?(TestUrl + "animated.gif")
assert_equal true, FastImage.animated?(TestUrl + "animated_without_gct.gif")
assert_equal false, FastImage.animated?(TestUrl + "webp_vp8x.webp")
assert_equal true, FastImage.animated?(TestUrl + "webp_animated.webp")
assert_equal false, FastImage.animated?(TestUrl + "avif/hato.avif")
assert_equal true, FastImage.animated?(TestUrl + "avif/red_green_flash.avif")
end
def test_should_return_nil_on_fetch_failure