Class: Capybara::Screenshot::Diff::Drivers::VipsDriver

Inherits:
Object
  • Object
show all
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

Instance Method Summary collapse

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, options = {})
  options = 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 = options || {}

  reset
end

Instance Attribute Details

#new_file_nameObject (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_nameObject (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

#optionsObject (readonly)

Returns the value of attribute options.



19
20
21
# File 'lib/capybara/screenshot/diff/drivers/vips_driver.rb', line 19

def options
  @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_comparatorObject



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

Returns:

  • (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

Returns:

  • (Boolean)


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

#resetObject

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

Returns:

  • (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

Returns:

  • (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