Class: Capybara::Screenshot::Diff::Drivers::VipsDriver
- Inherits:
-
Object
- Object
- Capybara::Screenshot::Diff::Drivers::VipsDriver
- Defined in:
- lib/capybara/screenshot/diff/drivers/vips_driver.rb
Defined Under Namespace
Classes: VipsUtil
Constant Summary collapse
- PNG_EXTENSION =
".png"
Instance Attribute Summary collapse
-
#new_file_name ⇒ Object
readonly
Returns the value of attribute new_file_name.
-
#old_file_name ⇒ Object
readonly
Returns the value of attribute old_file_name.
-
#options ⇒ Object
readonly
Returns the value of attribute options.
Instance Method Summary collapse
- #add_black_box(memo, region) ⇒ Object
- #adds_error_details_to(_log) ⇒ Object
- #chunky_png_comparator ⇒ Object
- #crop(region, i) ⇒ Object
- #difference_level(diff_mask, old_img, _region = nil) ⇒ Object
- #dimension(image) ⇒ Object
- #dimension_changed?(old_image, new_image) ⇒ Boolean
- #draw_rectangles(images, region, rgba) ⇒ Object
- #filter_image_with_median(image, median_filter_window_size) ⇒ Object
- #find_difference_region(new_image, old_image, color_distance_limit, _shift_distance_limit, _area_size_limit, fast_fail: false) ⇒ Object
- #from_file(filename) ⇒ Object
- #height_for(image) ⇒ Object
- #image_area_size(old_img) ⇒ Object
-
#initialize(new_file_name, old_file_name = nil, options = {}) ⇒ VipsDriver
constructor
A new instance of VipsDriver.
-
#inscribed?(dimensions, i) ⇒ Boolean
old private.
- #load_images(old_file_name, new_file_name, driver = self) ⇒ Object
-
#reset ⇒ Object
Resets the calculated data about the comparison with regard to the “new_image”.
- #resize_image_to(image, new_width, new_height) ⇒ Object
-
#save_image_to(image, filename) ⇒ Object
Vips could not work with the same file.
- #shift_distance_different? ⇒ Boolean
- #shift_distance_equal? ⇒ Boolean
- #skip_area=(new_skip_area) ⇒ Object
- #width_for(image) ⇒ Object
Constructor Details
#initialize(new_file_name, old_file_name = nil, options = {}) ⇒ VipsDriver
Returns a new instance of VipsDriver.
21 22 23 24 25 26 27 28 29 30 |
# File 'lib/capybara/screenshot/diff/drivers/vips_driver.rb', line 21 def initialize(new_file_name, old_file_name = nil, = {}) = old_file_name if old_file_name.is_a?(Hash) @new_file_name = new_file_name @old_file_name = old_file_name || "#{new_file_name}#{ImageCompare::TMP_FILE_SUFFIX}" @options = || {} reset end |
Instance Attribute Details
#new_file_name ⇒ Object (readonly)
Returns the value of attribute new_file_name.
19 20 21 |
# File 'lib/capybara/screenshot/diff/drivers/vips_driver.rb', line 19 def new_file_name @new_file_name end |
#old_file_name ⇒ Object (readonly)
Returns the value of attribute old_file_name.
19 20 21 |
# File 'lib/capybara/screenshot/diff/drivers/vips_driver.rb', line 19 def old_file_name @old_file_name end |
#options ⇒ Object (readonly)
Returns the value of attribute options.
19 20 21 |
# File 'lib/capybara/screenshot/diff/drivers/vips_driver.rb', line 19 def @options end |
Instance Method Details
#add_black_box(memo, region) ⇒ Object
85 86 87 |
# File 'lib/capybara/screenshot/diff/drivers/vips_driver.rb', line 85 def add_black_box(memo, region) memo.draw_rect([0, 0, 0, 0], *region.to_top_left_corner_coordinates, fill: true) end |
#adds_error_details_to(_log) ⇒ Object
60 61 |
# File 'lib/capybara/screenshot/diff/drivers/vips_driver.rb', line 60 def adds_error_details_to(_log) end |
#chunky_png_comparator ⇒ Object
89 90 91 92 93 94 95 |
# File 'lib/capybara/screenshot/diff/drivers/vips_driver.rb', line 89 def chunky_png_comparator @chunky_png_comparator ||= ImageCompare.new( @new_file_name, @old_file_name, **@options.merge(driver: :chunky_png, tolerance: nil, median_filter_window_size: nil) ) end |
#crop(region, i) ⇒ Object
69 70 71 72 73 74 75 76 77 78 79 |
# File 'lib/capybara/screenshot/diff/drivers/vips_driver.rb', line 69 def crop(region, i) result = i.crop(*region.to_top_left_corner_coordinates) # FIXME: Vips is caching operations, and if we ware going to read the same file, he will use cached version for this # so after we cropped files and stored in the same file, the next load will recover old version instead of cropped # Workaround to make vips works with cropped versions Vips.cache_set_max(0) Vips.vips_cache_set_max(1000) result end |
#difference_level(diff_mask, old_img, _region = nil) ⇒ Object
97 98 99 |
# File 'lib/capybara/screenshot/diff/drivers/vips_driver.rb', line 97 def difference_level(diff_mask, old_img, _region = nil) VipsUtil.difference_area_size_by(diff_mask).to_f / image_area_size(old_img) end |
#dimension(image) ⇒ Object
149 150 151 |
# File 'lib/capybara/screenshot/diff/drivers/vips_driver.rb', line 149 def dimension(image) [image.width, image.height] end |
#dimension_changed?(old_image, new_image) ⇒ Boolean
140 141 142 143 144 145 146 147 |
# File 'lib/capybara/screenshot/diff/drivers/vips_driver.rb', line 140 def dimension_changed?(old_image, new_image) return false if dimension(old_image) == dimension(new_image) change_msg = [old_image, new_image].map { |i| "#{i.width}x#{i.height}" }.join(" => ") warn "Image size has changed for #{@new_file_name}: #{change_msg}" true end |
#draw_rectangles(images, region, rgba) ⇒ Object
153 154 155 156 157 |
# File 'lib/capybara/screenshot/diff/drivers/vips_driver.rb', line 153 def draw_rectangles(images, region, rgba) images.map do |image| image.draw_rect(rgba, region.left - 1, region.top - 1, region.width + 2, region.height + 2) end end |
#filter_image_with_median(image, median_filter_window_size) ⇒ Object
81 82 83 |
# File 'lib/capybara/screenshot/diff/drivers/vips_driver.rb', line 81 def filter_image_with_median(image, median_filter_window_size) image.median(median_filter_window_size) end |
#find_difference_region(new_image, old_image, color_distance_limit, _shift_distance_limit, _area_size_limit, fast_fail: false) ⇒ Object
53 54 55 56 57 58 |
# File 'lib/capybara/screenshot/diff/drivers/vips_driver.rb', line 53 def find_difference_region(new_image, old_image, color_distance_limit, _shift_distance_limit, _area_size_limit, fast_fail: false) diff_mask = VipsUtil.difference_mask(color_distance_limit, old_image, new_image) region = VipsUtil.difference_region_by(diff_mask) [region, diff_mask] end |
#from_file(filename) ⇒ Object
131 132 133 134 135 136 137 138 |
# File 'lib/capybara/screenshot/diff/drivers/vips_driver.rb', line 131 def from_file(filename) result = ::Vips::Image.new_from_file(filename) result = result.colourspace("srgb") if result.bands < 3 result = result.bandjoin(255) if result.bands == 3 result end |
#height_for(image) ⇒ Object
105 106 107 |
# File 'lib/capybara/screenshot/diff/drivers/vips_driver.rb', line 105 def height_for(image) image.height end |
#image_area_size(old_img) ⇒ Object
101 102 103 |
# File 'lib/capybara/screenshot/diff/drivers/vips_driver.rb', line 101 def image_area_size(old_img) width_for(old_img) * height_for(old_img) end |
#inscribed?(dimensions, i) ⇒ Boolean
old private
65 66 67 |
# File 'lib/capybara/screenshot/diff/drivers/vips_driver.rb', line 65 def inscribed?(dimensions, i) dimension(i) == dimensions || i.width < dimensions[0] || i.height < dimensions[1] end |
#load_images(old_file_name, new_file_name, driver = self) ⇒ Object
127 128 129 |
# File 'lib/capybara/screenshot/diff/drivers/vips_driver.rb', line 127 def load_images(old_file_name, new_file_name, driver = self) [driver.from_file(old_file_name), driver.from_file(new_file_name)] end |
#reset ⇒ Object
Resets the calculated data about the comparison with regard to the “new_image”. Data about the original image is kept.
38 39 |
# File 'lib/capybara/screenshot/diff/drivers/vips_driver.rb', line 38 def reset end |
#resize_image_to(image, new_width, new_height) ⇒ Object
123 124 125 |
# File 'lib/capybara/screenshot/diff/drivers/vips_driver.rb', line 123 def resize_image_to(image, new_width, new_height) image.resize(1.* new_width / new_height) end |
#save_image_to(image, filename) ⇒ Object
Vips could not work with the same file. Per each process we require to create new file
116 117 118 119 120 121 |
# File 'lib/capybara/screenshot/diff/drivers/vips_driver.rb', line 116 def save_image_to(image, filename) ::Dir::Tmpname.create([filename, PNG_EXTENSION]) do |tmp_image_filename| image.write_to_file(tmp_image_filename) FileUtils.mv(tmp_image_filename, filename) end end |
#shift_distance_different? ⇒ Boolean
47 48 49 50 51 |
# File 'lib/capybara/screenshot/diff/drivers/vips_driver.rb', line 47 def shift_distance_different? warn "[capybara-screenshot-diff] Instead of shift_distance_limit " \ "please use median_filter_window_size and color_distance_limit options" chunky_png_comparator.different? end |
#shift_distance_equal? ⇒ Boolean
41 42 43 44 45 |
# File 'lib/capybara/screenshot/diff/drivers/vips_driver.rb', line 41 def shift_distance_equal? warn "[capybara-screenshot-diff] Instead of shift_distance_limit " \ "please use median_filter_window_size and color_distance_limit options" chunky_png_comparator.quick_equal? end |
#skip_area=(new_skip_area) ⇒ Object
32 33 34 |
# File 'lib/capybara/screenshot/diff/drivers/vips_driver.rb', line 32 def skip_area=(new_skip_area) # noop end |
#width_for(image) ⇒ Object
109 110 111 |
# File 'lib/capybara/screenshot/diff/drivers/vips_driver.rb', line 109 def width_for(image) image.width end |