summaryrefslogtreecommitdiffstats
path: root/lib/paperclip
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2018-02-21 03:40:12 +0100
committerGitHub <noreply@github.com>2018-02-21 03:40:12 +0100
commita7171af0a34f612d05667f1a5c35a4ca834da082 (patch)
treef4a941ca49d4a0b879906a252e26c89a88fc21b0 /lib/paperclip
parenta4fd4ad1d50221f4a6a032d3ffea6f620e8b9b5b (diff)
Fix avatar and header issues by using custom geometry detector (#6515)
* Fix avatar and header issues by using custom geometry detector Revert a part of #6508. The file passed to dynamic styles method was not actually a file, but an instance of Paperclip::Attachment, which broke all styles by always returning {} from the method. One problem with GIF avatars was that Paperclip::GeometryDetector reported wrong dimensions for them, e.g. 120x120 GIF avatar would for some reason be detected as 120x53. By writing our own geometry parser, we can use FastImage, which also happens to be faster than ImageMagick, to detect image dimensions, which are also correct. Unfortunately, this PR does not implement skipping a `convert` entirely if the dimensions are already correct, as I found no easy way to write that behaviour into Paperclip without rewriting the Paperclip::Thumbnail class. * Only invoke convert if dimension or format needs to be changed
Diffstat (limited to 'lib/paperclip')
-rw-r--r--lib/paperclip/lazy_thumbnail.rb24
1 files changed, 24 insertions, 0 deletions
diff --git a/lib/paperclip/lazy_thumbnail.rb b/lib/paperclip/lazy_thumbnail.rb
new file mode 100644
index 00000000000..594f0ce39cf
--- /dev/null
+++ b/lib/paperclip/lazy_thumbnail.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+module Paperclip
+ class LazyThumbnail < Paperclip::Thumbnail
+ def make
+ return @file unless needs_convert?
+ Paperclip::Thumbnail.make(file, options, attachment)
+ end
+
+ private
+
+ def needs_convert?
+ needs_different_geometry? || needs_different_format?
+ end
+
+ def needs_different_geometry?
+ !@target_geometry.nil? && @current_geometry.width != @target_geometry.width && @current_geometry.height != @target_geometry.height
+ end
+
+ def needs_different_format?
+ @format.present? && @current_format != @format
+ end
+ end
+end