class Capybara::Screenshot::Diff::Drivers::VipsDriver
Constants
- MAX_FILENAME_LENGTH
Public Instance Methods
Source
# File lib/capybara/screenshot/diff/drivers/vips_driver.rb, line 52 def add_black_box(memo, region) return memo unless region memo.draw_rect([0, 0, 0, 0], *region.to_top_left_corner_coordinates, fill: true) end
Source
# File lib/capybara/screenshot/diff/drivers/vips_driver.rb, line 38 def crop(region, i) i.crop(*region.to_top_left_corner_coordinates) rescue Vips::Error => e warn( "[capybara-screenshot-diff] Crop has been failed for " \ "{ region: #{region.to_top_left_corner_coordinates.inspect}, image: #{dimension(i).join("x")} }" ) raise e end
Source
# File lib/capybara/screenshot/diff/drivers/vips_driver.rb, line 58 def difference_level(diff_mask, old_img, _region = nil) VipsUtil.difference_area_size_by(diff_mask).to_f / image_area_size(old_img) end
Source
# File lib/capybara/screenshot/diff/drivers/vips_driver.rb, line 92 def dimension(image) [width_for(image), height_for(image)] end
Source
# File lib/capybara/screenshot/diff/drivers/vips_driver.rb, line 96 def draw_rectangles(images, region, rgba, offset: 0) images.map do |image| image.draw_rect(rgba, region.left - offset, region.top - offset, region.width + (offset * 2), region.height + (offset * 2)) end end
Source
# File lib/capybara/screenshot/diff/drivers/vips_driver.rb, line 48 def filter_image_with_median(image, median_filter_window_size) image.median(median_filter_window_size) end
Source
# File lib/capybara/screenshot/diff/drivers/vips_driver.rb, line 21 def find_difference_region(comparison) new_image, base_image, options = comparison.new_image, comparison.base_image, comparison.options diff_mask = VipsUtil.difference_mask(base_image, new_image, options[:color_distance_limit]) region = VipsUtil.difference_region_by(diff_mask) region = nil if region && same_as?(region, base_image) result = Difference.new(region, {}, comparison) unless result.blank? result.meta[:difference_level] = difference_level(diff_mask, base_image) if comparison.options[:tolerance] result.meta[:diff_mask] = diff_mask end result end
Source
# File lib/capybara/screenshot/diff/drivers/vips_driver.rb, line 83 def from_file(filename) result = ::Vips::Image.new_from_file(filename.to_s) result = result.colourspace(:srgb) if result.bands < 3 result = result.bandjoin(255) if result.bands == 3 result end
Source
# File lib/capybara/screenshot/diff/drivers/vips_driver.rb, line 110 def highlight_mask(diff_mask, merged_image, color: DEFAULT_HIGHLIGHT_COLOR) diff_mask.ifthenelse(color, merged_image * 0.75) end
Source
# File lib/capybara/screenshot/diff/drivers/vips_driver.rb, line 79 def load_images(old_file_name, new_file_name) [from_file(old_file_name), from_file(new_file_name)] end
Source
# File lib/capybara/screenshot/diff/drivers/vips_driver.rb, line 106 def merge(new_image, base_image) base_image.composite2(new_image, :over) end
Source
# File lib/capybara/screenshot/diff/drivers/vips_driver.rb, line 75 def resize_image_to(image, new_width, new_height) image.resize(new_width.to_f / new_height) end
Source
# File lib/capybara/screenshot/diff/drivers/vips_driver.rb, line 102 def same_pixels?(comparison) (comparison.new_image == comparison.base_image).min == 255 end
Source
# File lib/capybara/screenshot/diff/drivers/vips_driver.rb, line 65 def save_image_to(image, filename) # Dir::Tmpname will happily produce tempfile names that are too long for most unix filesystems, # which leads to "unix error: File name too long". Apply a limit to avoid this. limited_filename = filename.to_s[-MAX_FILENAME_LENGTH..] || filename.to_s ::Dir::Tmpname.create([limited_filename, PNG_EXTENSION]) do |tmp_image_filename| image.write_to_file(tmp_image_filename) FileUtils.mv(tmp_image_filename, filename) end end
Vips could not work with the same file. Per each process we require to create new file
Private Instance Methods
Source
# File lib/capybara/screenshot/diff/drivers/vips_driver.rb, line 116 def same_as?(region, base_image) region.x.zero? && region.y.zero? && region.height == height_for(base_image) && region.width == width_for(base_image) end