dynamic_image 3.0.7 → 3.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 63df20c9bb3d9e6ec0c62667a3d885086f2f17e2e5d3cf7181dcdef9d6c52057
4
- data.tar.gz: f94ae92030634af73011e745b96f445091c5140824b309a23ff653bc75f2d831
3
+ metadata.gz: f8c80c235c367dfba5f1f1dd4090306163154f3405137e1a4c75686b8320f678
4
+ data.tar.gz: ec04c685222c9653f058da65e72d07bfaaabba61015427c7f694868e85dc7ffb
5
5
  SHA512:
6
- metadata.gz: 10cda7189c6319e1e6e73c07856cf5d302d870485f5139e7389efa2c9f12fb2302e242f3fa7924d7ba4732c6525ad55e5b4e54d8e6430d88211dcb1dc0f1ce14
7
- data.tar.gz: 8077111478b4900b85086bd85849c94eb6fd372533ea3529a89c035d267e4c1b97e302f9a87b6621d40f6db9d9cc17bdf9e4f39696034f7ec7e9c111c885ab94
6
+ metadata.gz: c41a23304affdb4b95892ca12ba3039d2b205d7f4bb6f77f7a2ff72c38dbacd10b90bb9982ff4365608ce946a3204b7af8706f8b05143b85e35457a5710722bb
7
+ data.tar.gz: 75657ccd66682799dc73545bc48ddd35b1ebd703e82979404f4161b7e83a5c4d7bc487d97e791a7858ee648e0cd29f66c392a43d24115882500b810fa7bcfc23
@@ -3,7 +3,7 @@
3
3
  module DynamicImage
4
4
  class Format
5
5
  attr_reader :name, :animated, :content_types, :extensions, :magic_bytes,
6
- :save_options
6
+ :save_options, :signature
7
7
 
8
8
  def initialize(name, options)
9
9
  options = default_options.merge(options)
@@ -15,6 +15,7 @@ module DynamicImage
15
15
  @magic_bytes = options[:magic_bytes].map do |s|
16
16
  s.dup.force_encoding("binary")
17
17
  end
18
+ @signature = options[:signature]
18
19
  @save_options = options[:save_options]
19
20
  end
20
21
 
@@ -22,6 +23,12 @@ module DynamicImage
22
23
  animated
23
24
  end
24
25
 
26
+ def matches?(bytes)
27
+ return false unless magic_bytes.any? { |b| bytes.start_with?(b) }
28
+
29
+ signature.nil? || signature.call(bytes)
30
+ end
31
+
25
32
  def content_type
26
33
  content_types.first
27
34
  end
@@ -56,12 +63,7 @@ module DynamicImage
56
63
  def sniff(bytes)
57
64
  return unless bytes
58
65
 
59
- formats.each do |format|
60
- format.magic_bytes.each do |b|
61
- return format if bytes.start_with?(b)
62
- end
63
- end
64
- nil
66
+ formats.find { |format| format.matches?(bytes) }
65
67
  end
66
68
 
67
69
  private
@@ -73,7 +75,7 @@ module DynamicImage
73
75
 
74
76
  def default_options
75
77
  { animated: false, content_type: [], extension: [], magic_bytes: [],
76
- save_options: {} }
78
+ signature: nil, save_options: {} }
77
79
  end
78
80
 
79
81
  register(
@@ -119,6 +121,7 @@ module DynamicImage
119
121
  content_type: %w[image/webp],
120
122
  extension: %w[.webp],
121
123
  magic_bytes: ["\x52\x49\x46\x46"],
124
+ signature: ->(bytes) { bytes.bytesize >= 12 && bytes[8, 4] == "WEBP" },
122
125
  save_options: { Q: 90, strip: true }
123
126
  )
124
127
  end
@@ -2,6 +2,8 @@
2
2
 
3
3
  module DynamicImage
4
4
  class ImageReader
5
+ HEADER_BYTES = 12
6
+
5
7
  def initialize(data)
6
8
  @data = data
7
9
  end
@@ -37,10 +39,10 @@ module DynamicImage
37
39
 
38
40
  def read_file_header
39
41
  if @data.is_a?(Pathname)
40
- File.binread(@data.to_s, 8)
42
+ File.binread(@data.to_s, HEADER_BYTES)
41
43
  else
42
44
  data_stream = stream
43
- header = data_stream.read(8)
45
+ header = data_stream.read(HEADER_BYTES)
44
46
  data_stream.seek(0 - header.length, IO::SEEK_CUR) if header
45
47
  header
46
48
  end
@@ -65,17 +65,21 @@ module DynamicImage
65
65
 
66
66
  def read_metadata
67
67
  image = reader.read
68
+ width, height = dimensions_from(image)
69
+ width, height = height, width if rotated?(image)
70
+ { width:, height:, colorspace: image.get("interpretation") }
71
+ rescue Vips::Error
72
+ :invalid
73
+ end
68
74
 
75
+ def dimensions_from(image)
69
76
  width = image.get("width")
70
77
  height = if image.get_fields.include?("page-height")
71
78
  image.get("page-height")
72
79
  else
73
80
  image.get("height")
74
81
  end
75
-
76
- width, height = height, width if rotated?(image)
77
-
78
- { width:, height:, colorspace: image.get("interpretation") }
82
+ [width, height]
79
83
  end
80
84
 
81
85
  def orientation(image)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DynamicImage
4
- VERSION = "3.0.7"
4
+ VERSION = "3.0.8"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dynamic_image
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.7
4
+ version: 3.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Inge Jørgensen
@@ -135,7 +135,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
135
135
  - !ruby/object:Gem::Version
136
136
  version: '0'
137
137
  requirements: []
138
- rubygems_version: 4.0.3
138
+ rubygems_version: 4.0.10
139
139
  specification_version: 4
140
140
  summary: Rails plugin that simplifies image uploading and processing
141
141
  test_files: []