chunky_png_subimage 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b831ded7991e426e5ea0b3cb450e0babcdc9eea3
4
- data.tar.gz: 2eed01e388eb872bea4212e28484dc451b901c18
3
+ metadata.gz: 6426dbb98ddd9eb1ec1f48050cbab98e45c44ea8
4
+ data.tar.gz: 6c0a714e56825f2f6d58a73be354e42944a66348
5
5
  SHA512:
6
- metadata.gz: 4bd73017a35271c8805c42c4dab5b3b4f7574eeab48784989c464812add7bd6a369bbe4e0a3b199fa518705447141543470142e0def6b16ef7d089d78143d0f5
7
- data.tar.gz: 1e0ad1dbdb047ab4caaf1a7c61e3ea39bc1fbe48ffbc49c9a5e3d436576021a5e54ffa9fbdf4ab3bc8b6c1a17328fedfb5d94700b6ee7c4409db411cb9cba3b8
6
+ metadata.gz: 111903fb0d4a9336f2c09bac57cdfe2714c7618f6a7fa8c0fba40f6af2aafb91a660dbe568e27b9a18353fdb79fb1575d50431a329e2ff96efe760dc7cb5c414
7
+ data.tar.gz: a674d5e4901cc83e5d871b2fd162bca7792a3458407352c1b2d5ca2c5016e644baf37c69c92455d676f1ff237c84b31405a04e65002d5fdbe6e234522d00a259
data/Rakefile CHANGED
@@ -6,7 +6,13 @@ Rake::ExtensionTask.new('chunky_png_subimage') do |ext|
6
6
  #ext.config_options = '--with-cflags="-std=c99"'
7
7
  end
8
8
 
9
- #require 'rspec/core/rake_task'
10
- #RSpec::Core::RakeTask.new(:spec)
9
+ require 'rspec/core/rake_task'
11
10
 
12
- task :default => [:compile]
11
+ RSpec::Core::RakeTask.new(:spec) do |task|
12
+ task.pattern = "./spec/spec.rb"
13
+ task.rspec_opts = ['--color']
14
+ end
15
+
16
+ Rake::Task['spec'].prerequisites << :compile
17
+
18
+ task :default => [:spec]
@@ -1,10 +1,54 @@
1
+ /** Ruby C extension 'chunky_png_subimage', source
2
+ *
3
+ * The MIT License (MIT)
4
+ *
5
+ * Copyright (c) 2014 Denis Mingulov
6
+ *
7
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ * of this software and associated documentation files (the "Software"), to deal
9
+ * in the Software without restriction, including without limitation the rights
10
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ * copies of the Software, and to permit persons to whom the Software is
12
+ * furnished to do so, subject to the following conditions:
13
+ *
14
+ * The above copyright notice and this permission notice shall be included in all
15
+ * copies or substantial portions of the Software.
16
+ *
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
+ * SOFTWARE.
24
+ */
25
+
1
26
  #include "chunky_png_subimage.h"
2
27
 
28
+ /** Check that the color from subimage is usable to search
29
+ * @param color Color to be checked
30
+ * @return 0 whether color is not usable, non-0 otherwise
31
+ */
3
32
  static inline int is_color_usable(unsigned int color)
4
33
  {
34
+ /* currently - fully opaque points are used only */
5
35
  return (color & 0xff) == 0xff;
6
36
  }
7
37
 
38
+ /** Search a single subimage inside image
39
+ * @param img Pointer to uint colors for image (must be imgWidth * imgHeight)
40
+ * @param imgWidth Image width
41
+ * @param imgHeight Image height
42
+ * @param searchX Offset X of 1st possible point for subimage
43
+ * @param searchY Offset Y of 1st possible point for subimage
44
+ * @param searchWidth Width for the search region
45
+ * @param searchHeight Height for the search region
46
+ * @param sub Pointer to uint colors for subimage (must be subWidth * subHeight)
47
+ * @param subWidth Subimage width
48
+ * @param subHeight Subimage height
49
+ * @param singleMode 0 whether search every image, non-0 - to stop after 1st found
50
+ * @return Ruby array with [x, y] entries - found positions of subimage
51
+ */
8
52
  static VALUE search_single_subimage(const unsigned int *img, const int imgWidth, const int imgHeight,
9
53
  const int searchX, const int searchY, const int searchWidth, const int searchHeight,
10
54
  const unsigned int *sub, const int subWidth, const int subHeight, int singleMode)
@@ -76,7 +120,12 @@ static VALUE search_single_subimage(const unsigned int *img, const int imgWidth,
76
120
  return result;
77
121
  }
78
122
 
79
- /* convert image to int*, xfree must be used later */
123
+ /** convert image with Ruby values to unsigned int*, xfree must be used later
124
+ * @param imgPixels Pointer to 1st element of Ruby array with data points (should be imgWidth * imgHeight)
125
+ * @param imgWidth Width of the image
126
+ * @param imgHeight Height of the image
127
+ * @return Pointer to unsigned int values, xfree must be used later
128
+ */
80
129
  static unsigned int *convert_image(const VALUE *imgPixels, const int imgWidth, const int imgHeight)
81
130
  {
82
131
  unsigned int *imgReady = xmalloc(sizeof(unsigned int) * imgWidth * imgHeight);
@@ -89,6 +138,18 @@ static unsigned int *convert_image(const VALUE *imgPixels, const int imgWidth, c
89
138
  return imgReady;
90
139
  }
91
140
 
141
+ /** Exportable function to ruby, to search subimages in the image
142
+ * @param argc Amount of elements in argv
143
+ * @param argv Parameters:
144
+ * img array of pixels, img width, img height,
145
+ * search offset x, search offset y, search width, search height,
146
+ * singleMode (bit 1 - for subimage search, bit 0 - to stop after 1st found subimage),
147
+ * amount of subimages,
148
+ * for every subimage:
149
+ * subimage array of pixels, subimage width, subimage height
150
+ * @param self Object
151
+ * @return Array of found subimages' positions
152
+ */
92
153
  VALUE search_subimages(int argc, VALUE *argv, VALUE self)
93
154
  {
94
155
  /*
@@ -164,6 +225,7 @@ VALUE search_subimages(int argc, VALUE *argv, VALUE self)
164
225
 
165
226
  rb_ary_push(result, r);
166
227
 
228
+ /* stop if the proper single mode and result is found */
167
229
  if ((singleMode & 1) && RARRAY_LEN(r) > 0)
168
230
  break;
169
231
 
@@ -175,6 +237,7 @@ VALUE search_subimages(int argc, VALUE *argv, VALUE self)
175
237
  return result;
176
238
  }
177
239
 
240
+ /** Entry point for an initialization */
178
241
  void Init_chunky_png_subimage()
179
242
  {
180
243
  VALUE mainModule = rb_define_module("ChunkyPNGSubimage");
@@ -1,8 +1,34 @@
1
+ /** Ruby C extension 'chunky_png_subimage', header
2
+ *
3
+ * The MIT License (MIT)
4
+ *
5
+ * Copyright (c) 2014 Denis Mingulov
6
+ *
7
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ * of this software and associated documentation files (the "Software"), to deal
9
+ * in the Software without restriction, including without limitation the rights
10
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ * copies of the Software, and to permit persons to whom the Software is
12
+ * furnished to do so, subject to the following conditions:
13
+ *
14
+ * The above copyright notice and this permission notice shall be included in all
15
+ * copies or substantial portions of the Software.
16
+ *
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
+ * SOFTWARE.
24
+ */
25
+
1
26
  #ifndef CHUNKY_PNG_SUBIMAGE_H
2
27
  #define CHUNKY_PNG_SUBIMAGE_H
3
28
 
4
29
  #include <ruby.h>
5
30
 
31
+ /* Entry point for an initialization */
6
32
  void Init_chunky_png_subimage();
7
33
 
8
- #endif
34
+ #endif
@@ -1,5 +1,3 @@
1
1
  require 'mkmf'
2
2
 
3
- #have_func("labs", "stdlib.h")
4
-
5
3
  create_makefile('chunky_png_subimage/chunky_png_subimage')
@@ -1,7 +1,57 @@
1
- require 'chunky_png'
1
+ # = ChunkyPNGSubimage
2
+ #
3
+ # Search subimages inside image - fast as ruby C extension is used.
4
+ #
5
+ # == Synopsys
6
+ #
7
+ # require 'chunky_png'
8
+ # require 'chunky_png_subimage'
9
+ #
10
+ # img = ChunkyPNG::Image.new(10, 10, ChunkyPNG::Color::WHITE)
11
+ # sub1 = ChunkyPNG::Image.new(5, 5, ChunkyPNG::Color::BLACK)
12
+ # sub2 = ChunkyPNG::Image.new(9, 9, ChunkyPNG::Color::WHITE)
13
+ #
14
+ # puts ChunkyPNGSubimage.search_subimage img, sub1
15
+ # puts ChunkyPNGSubimage.search_subimage img, [sub1, sub2]
16
+ #
17
+ # == Introduction
18
+ #
19
+ # Quite often it is required to find the position of some image on the bigger image.
20
+ # For example use case - a test with watir-webdriver for the external Flash page.
21
+ # Or just some automation for the some other application with some other screenshot maker.
22
+ # This library allows fastly to find subimages on the big image, so you might react
23
+ # almost instantly to the change.
24
+ # Of couse it can be used for any other reasons.
25
+
2
26
  require 'chunky_png_subimage/chunky_png_subimage'
3
27
 
4
28
  module ChunkyPNGSubimage
29
+
30
+ # Search subimages on the image.
31
+ #
32
+ # ==== Attributes
33
+ #
34
+ # * +img+ - Image where search for subimages will be done
35
+ # * +subimages+ - Subimage or an array of subimages. Just fully opaque pixels are used from any subimage.
36
+ # * +single+ - 'single mode', when to stop if an subimage is found, possible values:
37
+ # :single_everywhere - fully stop after 1st subimage is found;
38
+ # :single_same_subimage - search maximum 1 subimage position, for every provided subimage;
39
+ # :single_subimage - stop after 1st subimage is found, but find every possible position for that subimage;
40
+ # anything else - search for every possible subimage multiple times.
41
+ # * +x+ - if find subimages inside some region of image - offset x (0 by default)
42
+ # * +y+ - if find subimages inside some region of image - offset y (0 by default)
43
+ # * +width+ - if find subimages inside some region of image - width of that region (full image by default)
44
+ # * +height+ - if find subimages inside some region of image - height of that region (full image by default)
45
+ #
46
+ # ==== Output
47
+ #
48
+ # Method returns:
49
+ # * An array of arrays with positions of found subimages.
50
+ # * If just single subimage is provided (without array) - then the output also does not contain outer array.
51
+ #
52
+ # ==== Examples
53
+ #
54
+ # ChunkyPNGSubimage.search_subimage img, sub
5
55
  #
6
56
  def self.search_subimage img, subimages, single = :single_same_subimage, x = 0, y = 0, width = 0, height = 0
7
57
  many_subimages = subimages.is_a? Array
@@ -1,3 +1,3 @@
1
1
  module ChunkyPNGSubimage
2
- VERSION = "0.1.2"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -1,4 +1,3 @@
1
- require 'chunky_png'
2
1
  require 'chunky_png_subimage/version'
3
2
  require 'chunky_png_subimage/chunky_png_subimage'
4
3
  require 'chunky_png_subimage/search'
data/spec/spec.rb ADDED
@@ -0,0 +1,39 @@
1
+ require 'chunky_png_subimage'
2
+ require 'chunky_png'
3
+
4
+ describe ChunkyPNGSubimage do
5
+
6
+ before(:each) do
7
+ @white_big = ChunkyPNG::Image.new(10, 10, ChunkyPNG::Color::WHITE)
8
+ @white_medium = ChunkyPNG::Image.new(5, 5, ChunkyPNG::Color::WHITE)
9
+ @black_big = ChunkyPNG::Image.new(10, 10, ChunkyPNG::Color::BLACK)
10
+ @black_medium = ChunkyPNG::Image.new(5, 5, ChunkyPNG::Color::BLACK)
11
+ @black_big_tr = ChunkyPNG::Image.new(5, 5, ChunkyPNG::Color::BLACK)
12
+ @black_big_tr[1, 1] = ChunkyPNG::Color::WHITE
13
+ @black_big_tr[3, 1] = ChunkyPNG::Color::WHITE
14
+ @black_big_tr[1, 3] = ChunkyPNG::Color::WHITE
15
+ @black_big_tr[3, 3] = ChunkyPNG::Color::WHITE
16
+ @black_small_tr = ChunkyPNG::Image.new(3, 3, ChunkyPNG::Color::BLACK)
17
+ @black_small_tr[1, 1] = 0
18
+ end
19
+
20
+ describe '#search_subimage' do
21
+ #search_subimage img, subimages, single = :single_same_subimage, x = 0, y = 0, width = 0, height = 0
22
+
23
+ it "white on black should not find anything" do
24
+ ChunkyPNGSubimage.search_subimage(@black_big, @white_medium).should == []
25
+ ChunkyPNGSubimage.search_subimage(@black_big, @white_medium, :single_same_subimage).should == []
26
+ ChunkyPNGSubimage.search_subimage(@black_big, @white_medium, :single_everywhere).should == []
27
+ ChunkyPNGSubimage.search_subimage(@black_big, @white_medium, :single_subimage).should == []
28
+ ChunkyPNGSubimage.search_subimage(@black_big, @white_medium, :everything).should == []
29
+ end
30
+
31
+ it "default mode is :single_same_subimage" do
32
+ ChunkyPNGSubimage.search_subimage(@black_big, @black_medium, :single_same_subimage).should == ChunkyPNGSubimage.search_subimage(@black_big, @black_medium)
33
+ ChunkyPNGSubimage.search_subimage(@white_big, @black_medium, :single_same_subimage).should == ChunkyPNGSubimage.search_subimage(@white_big, @black_medium)
34
+ ChunkyPNGSubimage.search_subimage(@white_big, @white_medium, :single_same_subimage).should == ChunkyPNGSubimage.search_subimage(@white_big, @white_medium)
35
+ ChunkyPNGSubimage.search_subimage(@black_big, [@black_medium, @black_small_tr], :single_same_subimage).should == ChunkyPNGSubimage.search_subimage(@black_big, [@black_medium, @black_small_tr])
36
+ end
37
+
38
+ end
39
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chunky_png_subimage
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Denis Mingulov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-17 00:00:00.000000000 Z
11
+ date: 2014-04-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: chunky_png
@@ -102,6 +102,7 @@ files:
102
102
  - lib/chunky_png_subimage.rb
103
103
  - lib/chunky_png_subimage/search.rb
104
104
  - lib/chunky_png_subimage/version.rb
105
+ - spec/spec.rb
105
106
  homepage: http://github.com/mingulov/chunky_png_subimage
106
107
  licenses:
107
108
  - MIT
@@ -126,4 +127,5 @@ rubygems_version: 2.2.2
126
127
  signing_key:
127
128
  specification_version: 4
128
129
  summary: Support to search subimages for ChunkyPNG
129
- test_files: []
130
+ test_files:
131
+ - spec/spec.rb