ruby-vips 2.0.13 → 2.0.14

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +10 -0
  3. data/.rubocop_todo.yml +730 -0
  4. data/.travis.yml +13 -6
  5. data/CHANGELOG.md +8 -0
  6. data/README.md +5 -8
  7. data/Rakefile +6 -0
  8. data/VERSION +1 -1
  9. data/example/annotate.rb +2 -2
  10. data/example/daltonize8.rb +14 -14
  11. data/example/example2.rb +6 -6
  12. data/example/example3.rb +5 -5
  13. data/example/example4.rb +4 -4
  14. data/example/example5.rb +2 -2
  15. data/example/inheritance_with_refcount.rb +207 -207
  16. data/example/thumb.rb +10 -10
  17. data/example/trim8.rb +2 -2
  18. data/example/watermark.rb +14 -35
  19. data/example/wobble.rb +24 -24
  20. data/install-vips.sh +1 -1
  21. data/lib/vips.rb +335 -306
  22. data/lib/vips/access.rb +9 -9
  23. data/lib/vips/align.rb +7 -7
  24. data/lib/vips/angle.rb +8 -8
  25. data/lib/vips/angle45.rb +12 -12
  26. data/lib/vips/bandformat.rb +16 -16
  27. data/lib/vips/blend_mode.rb +34 -0
  28. data/lib/vips/coding.rb +11 -11
  29. data/lib/vips/compass_direction.rb +13 -13
  30. data/lib/vips/direction.rb +7 -7
  31. data/lib/vips/extend.rb +13 -13
  32. data/lib/vips/gobject.rb +94 -94
  33. data/lib/vips/gvalue.rb +232 -232
  34. data/lib/vips/image.rb +1329 -1335
  35. data/lib/vips/interesting.rb +10 -10
  36. data/lib/vips/interpolate.rb +51 -51
  37. data/lib/vips/interpretation.rb +25 -25
  38. data/lib/vips/kernel.rb +18 -18
  39. data/lib/vips/methods.rb +463 -283
  40. data/lib/vips/object.rb +208 -208
  41. data/lib/vips/operation.rb +323 -323
  42. data/lib/vips/operationboolean.rb +10 -10
  43. data/lib/vips/operationcomplex.rb +8 -8
  44. data/lib/vips/operationcomplex2.rb +6 -6
  45. data/lib/vips/operationcomplexget.rb +7 -7
  46. data/lib/vips/operationmath.rb +14 -14
  47. data/lib/vips/operationmath2.rb +6 -6
  48. data/lib/vips/operationrelational.rb +11 -11
  49. data/lib/vips/operationround.rb +7 -7
  50. data/lib/vips/size.rb +9 -9
  51. data/lib/vips/version.rb +1 -1
  52. data/ruby-vips.gemspec +6 -2
  53. metadata +29 -6
@@ -1,12 +1,11 @@
1
- dist: trusty
2
- sudo: false
1
+ dist: xenial
3
2
 
4
3
  env:
5
4
  global:
6
5
  - NOKOGIRI_USE_SYSTEM_LIBRARIES=true
7
6
  - VIPS_VERSION_MAJOR=8
8
- - VIPS_VERSION_MINOR=6
9
- - VIPS_VERSION_MICRO=4
7
+ - VIPS_VERSION_MINOR=7
8
+ - VIPS_VERSION_MICRO=2
10
9
  - PATH=$HOME/vips/bin:$PATH
11
10
  - LD_LIBRARY_PATH=$HOME/vips/lib:$LD_LIBRARY_PATH
12
11
  - PKG_CONFIG_PATH=$HOME/vips/lib/pkgconfig:$PKG_CONFIG_PATH
@@ -33,6 +32,7 @@ addons:
33
32
  - libwebp-dev
34
33
 
35
34
  cache:
35
+ bundler: true
36
36
  directories:
37
37
  - $HOME/vips
38
38
 
@@ -44,12 +44,19 @@ rvm:
44
44
  - 2.3
45
45
  - 2.4
46
46
  - 2.5
47
+ - 2.6
47
48
 
48
- script: "bundle exec rake"
49
+ script: bundle exec rake spec
49
50
 
50
51
  gemfile:
51
52
  - Gemfile
52
53
 
53
54
  before_install:
54
55
  - uname -a
55
- - bash install-vips.sh
56
+ - bash install-vips.sh
57
+
58
+ jobs:
59
+ include:
60
+ - stage: Lint
61
+ rvm: 2.6
62
+ script: bundle exec rake rubocop
@@ -2,6 +2,14 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ## Version 2.0.14 (2018-10-3)
6
+
7
+ * update links for new home [jcupitt]
8
+ * various doc fixes [janko-m]
9
+ * add `Vips::get_suffixes` [jcupitt]
10
+ * prefer options splat [ioquatix]
11
+ * update docs for 8.8 [jcupitt]
12
+
5
13
  ## Version 2.0.13 (2018-8-6)
6
14
 
7
15
  * allow optional args to have `nil` as a value [janko-m]
data/README.md CHANGED
@@ -1,10 +1,10 @@
1
1
  # ruby-vips
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/ruby-vips.svg)](https://badge.fury.io/rb/ruby-vips)
4
- [![Build Status](https://travis-ci.org/jcupitt/ruby-vips.svg?branch=master)](https://travis-ci.org/jcupitt/ruby-vips)
4
+ [![Build Status](https://travis-ci.org/libvips/ruby-vips.svg?branch=master)](https://travis-ci.org/libvips/ruby-vips)
5
5
 
6
6
  This gem provides a Ruby binding for the [libvips image processing
7
- library](https://jcupitt.github.io/libvips).
7
+ library](https://libvips.github.io/libvips).
8
8
 
9
9
  Programs that use `ruby-vips` don't
10
10
  manipulate images directly, instead they create pipelines of image processing
@@ -31,16 +31,13 @@ rmagick.rb 788768
31
31
  ```
32
32
 
33
33
  See also [benchmarks at the official libvips
34
- website](https://github.com/jcupitt/libvips/wiki/Speed-and-memory-use).
35
- There's a handy blog post explaining [how libvips opens
36
- files](http://libvips.blogspot.co.uk/2012/06/how-libvips-opens-file.html)
37
- which gives some more background.
34
+ website](https://github.com/libvips/libvips/wiki/Speed-and-memory-use).
38
35
 
39
36
  ## Requirements
40
37
 
41
38
  * macOS, Linux, and Windows tested
42
39
 
43
- * libvips 8.2 or later, see the [libvips install instructions](https://jcupitt.github.io/libvips/install.html)
40
+ * libvips 8.2 or later, see the [libvips install instructions](https://libvips.github.io/libvips/install.html)
44
41
 
45
42
  * [ruby-ffi](https://github.com/ffi/ffi) 1.9 or later
46
43
 
@@ -76,7 +73,7 @@ im = Vips::Image.new_from_file filename
76
73
  # put im at position (100, 100) in a 3000 x 3000 pixel image,
77
74
  # make the other pixels in the image by mirroring im up / down /
78
75
  # left / right, see
79
- # https://jcupitt.github.io/libvips/API/current/libvips-conversion.html#vips-embed
76
+ # https://libvips.github.io/libvips/API/current/libvips-conversion.html#vips-embed
80
77
  im = im.embed 100, 100, 3000, 3000, extend: :mirror
81
78
 
82
79
  # multiply the green (middle) band by 2, leave the other two alone
data/Rakefile CHANGED
@@ -27,3 +27,9 @@ require "yard/rake/yardoc_task"
27
27
 
28
28
  YARD::Rake::YardocTask.new do |yard|
29
29
  end
30
+
31
+ # RuboCop requires Ruby >= 2.2
32
+ if Gem.ruby_version >= Gem::Version.new("2.2.0")
33
+ require 'rubocop/rake_task'
34
+ RuboCop::RakeTask.new
35
+ end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.0.13
1
+ 2.0.14
@@ -5,13 +5,13 @@ require 'vips'
5
5
  im = Vips::Image.new_from_file ARGV[0], :access => :sequential
6
6
 
7
7
  left_text = Vips::Image.text "left corner", :dpi => 300
8
- left = left_text.embed 50, 50, im.width, 150
8
+ left = left_text.embed 50, 50, im.width, 150
9
9
 
10
10
  right_text = Vips::Image.text "right corner", :dpi => 300
11
11
  right = right_text.embed im.width - right_text.width - 50, 50, im.width, 150
12
12
 
13
13
  footer = (left | right).ifthenelse(0, [255, 0, 0], :blend => true)
14
14
 
15
- im = im.insert footer, 0, im.height, :expand => true
15
+ im = im.insert footer, 0, im.height, :expand => true
16
16
 
17
17
  im.write_to_file ARGV[1]
@@ -28,20 +28,20 @@ im = Vips::Image.new_from_file ARGV[0]
28
28
  # remove any alpha channel before processing
29
29
  alpha = nil
30
30
  if im.bands == 4
31
- alpha = im[3]
32
- im = im.extract_band 0, :n => 3
31
+ alpha = im[3]
32
+ im = im.extract_band 0, :n => 3
33
33
  end
34
34
 
35
35
  begin
36
- # import to XYZ with lcms
37
- # if there's no profile there, we'll fall back to the thing below
38
- xyz = im.icc_import :embedded => true, :pcs => :xyz
36
+ # import to XYZ with lcms
37
+ # if there's no profile there, we'll fall back to the thing below
38
+ xyz = im.icc_import :embedded => true, :pcs => :xyz
39
39
  rescue Vips::Error
40
- # nope .. use the built-in converter instead
41
- xyz = im.colourspace :xyz
40
+ # nope .. use the built-in converter instead
41
+ xyz = im.colourspace :xyz
42
42
  end
43
43
 
44
- brad = xyz.recomb xyz_to_brad
44
+ brad = xyz.recomb xyz_to_brad
45
45
 
46
46
  # through the Deuteranope matrix
47
47
  # we need rows to sum to 1 in Bradford space --- the matrix in the original
@@ -52,24 +52,24 @@ deut = brad.recomb [
52
52
  [0, 0, 1]
53
53
  ]
54
54
 
55
- xyz = deut.recomb brad_to_xyz
55
+ xyz = deut.recomb brad_to_xyz
56
56
 
57
- # .. and back to sRGB
57
+ # .. and back to sRGB
58
58
  rgb = xyz.colourspace :srgb
59
59
 
60
- # so this is the colour error
60
+ # so this is the colour error
61
61
  err = im - rgb
62
62
 
63
63
  # add the error back to other channels to make a compensated image
64
64
  im = im + err.recomb([
65
- [0, 0, 0],
65
+ [0, 0, 0],
66
66
  [0.7, 1, 0],
67
67
  [0.7, 0, 1]
68
68
  ])
69
69
 
70
70
  # reattach any alpha we saved above
71
71
  if alpha
72
- im = im.bandjoin(alpha)
72
+ im = im.bandjoin(alpha)
73
73
  end
74
74
 
75
- im.write_to_file ARGV[1]
75
+ im.write_to_file ARGV[1]
@@ -17,12 +17,12 @@ Vips::cache_set_max 0
17
17
  n = 10000
18
18
 
19
19
  n.times do |i|
20
- puts ""
21
- puts "call #{i} ..."
22
- out = Vips::Operation.call "black", [200, 300]
23
- if out.width != 200 or out.height != 300
24
- puts "bad image result from black"
25
- end
20
+ puts ""
21
+ puts "call #{i} ..."
22
+ out = Vips::Operation.call "black", [200, 300]
23
+ if out.width != 200 or out.height != 300
24
+ puts "bad image result from black"
25
+ end
26
26
  end
27
27
 
28
28
  puts ""
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'vips'
4
4
 
5
- # this makes vips keep a list of all active objects
5
+ # this makes vips keep a list of all active objects
6
6
  Vips::leak_set true
7
7
 
8
8
  # disable the operation cache
@@ -12,8 +12,8 @@ Vips::leak_set true
12
12
  GLib::logger.level = Logger::DEBUG
13
13
 
14
14
  1.times do |i|
15
- puts "loop #{i} ..."
16
- im = Vips::Image.new_from_file ARGV[0]
17
- im = im.embed 100, 100, 3000, 3000, :extend => :mirror
18
- im.write_to_file "x.v"
15
+ puts "loop #{i} ..."
16
+ im = Vips::Image.new_from_file ARGV[0]
17
+ im = im.embed 100, 100, 3000, 3000, :extend => :mirror
18
+ im.write_to_file "x.v"
19
19
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'vips'
4
4
 
5
- # this makes vips keep a list of all active objects
5
+ # this makes vips keep a list of all active objects
6
6
  Vips::leak_set true
7
7
 
8
8
  # disable the operation cache
@@ -12,7 +12,7 @@ Vips::leak_set true
12
12
  #Vips.set_debug true
13
13
 
14
14
  ARGV.each do |filename|
15
- im = Vips::Image.new_from_file filename
16
- profile = im.get_value "icc-profile-data"
17
- puts "profile has #{profile.length} bytes"
15
+ im = Vips::Image.new_from_file filename
16
+ profile = im.get_value "icc-profile-data"
17
+ puts "profile has #{profile.length} bytes"
18
18
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'vips'
4
4
 
5
- # this makes vips keep a list of all active objects
5
+ # this makes vips keep a list of all active objects
6
6
  # Vips::leak_set true
7
7
 
8
8
  # disable the operation cache
@@ -12,7 +12,7 @@ require 'vips'
12
12
  #Vips.set_debug true
13
13
 
14
14
  if ARGV.length < 2
15
- raise "usage: #{$PROGRAM_NAME}: input-file output-file"
15
+ raise "usage: #{$PROGRAM_NAME}: input-file output-file"
16
16
  end
17
17
 
18
18
  im = Vips::Image.new_from_file ARGV[0], :access => :sequential
@@ -10,277 +10,277 @@ $vips_debug = true
10
10
 
11
11
  # @private
12
12
  def log str
13
- if $vips_debug
14
- puts str
15
- end
13
+ if $vips_debug
14
+ puts str
15
+ end
16
16
  end
17
17
 
18
18
  def set_debug debug
19
- $vips_debug = debug
19
+ $vips_debug = debug
20
20
  end
21
21
 
22
22
  module Libc
23
- extend FFI::Library
24
- ffi_lib FFI::Library::LIBC
23
+ extend FFI::Library
24
+ ffi_lib FFI::Library::LIBC
25
25
 
26
- attach_function :malloc, [:size_t], :pointer
27
- attach_function :free, [:pointer], :void
26
+ attach_function :malloc, [:size_t], :pointer
27
+ attach_function :free, [:pointer], :void
28
28
  end
29
29
 
30
30
  module GLib
31
- extend FFI::Library
32
- ffi_lib 'gobject-2.0'
33
-
34
- # nil being the default
35
- glib_log_domain = nil
36
-
37
- def self.set_log_domain(domain)
38
- glib_log_domain = domain
39
- end
40
-
41
- # we have a set of things we need to inherit in different ways:
42
- #
43
- # - we want to be able to subclass GObject in a simple way
44
- # - the layouts of the nested structs
45
- # - casting between structs which share a base
46
- # - gobject refcounting
47
- #
48
- # the solution is to split the class into four areas which we treat
49
- # differently:
50
- #
51
- # - we have a "wrapper" Ruby class to allow easy subclassing ... this has a
52
- # @struct member which holds the actual pointer
53
- # - we use "forwardable" to forward the various ffi methods on to the
54
- # @struct member ... we arrange things so that subclasses do not need to
55
- # do the forwarding themselves
56
- # - we have two versions of the struct: a plain one which we can use for
57
- # casting that will not change the refcounts
58
- # - and a managed one with an unref which we just use for .new
59
- # - we separate the struct layout into a separate module to avoid repeating
60
- # ourselves
61
-
62
- class GObject
63
- extend Forwardable
64
- extend SingleForwardable
65
-
66
- def_instance_delegators :@struct, :[], :to_ptr
67
- def_single_delegators :ffi_struct, :ptr
68
-
69
- # the layout of the GObject struct
70
- module GObjectLayout
71
- def self.included(base)
72
- base.class_eval do
73
- layout :g_type_instance, :pointer,
74
- :ref_count, :uint,
75
- :qdata, :pointer
76
- end
77
- end
31
+ extend FFI::Library
32
+ ffi_lib 'gobject-2.0'
33
+
34
+ # nil being the default
35
+ glib_log_domain = nil
36
+
37
+ def self.set_log_domain(domain)
38
+ glib_log_domain = domain
39
+ end
40
+
41
+ # we have a set of things we need to inherit in different ways:
42
+ #
43
+ # - we want to be able to subclass GObject in a simple way
44
+ # - the layouts of the nested structs
45
+ # - casting between structs which share a base
46
+ # - gobject refcounting
47
+ #
48
+ # the solution is to split the class into four areas which we treat
49
+ # differently:
50
+ #
51
+ # - we have a "wrapper" Ruby class to allow easy subclassing ... this has a
52
+ # @struct member which holds the actual pointer
53
+ # - we use "forwardable" to forward the various ffi methods on to the
54
+ # @struct member ... we arrange things so that subclasses do not need to
55
+ # do the forwarding themselves
56
+ # - we have two versions of the struct: a plain one which we can use for
57
+ # casting that will not change the refcounts
58
+ # - and a managed one with an unref which we just use for .new
59
+ # - we separate the struct layout into a separate module to avoid repeating
60
+ # ourselves
61
+
62
+ class GObject
63
+ extend Forwardable
64
+ extend SingleForwardable
65
+
66
+ def_instance_delegators :@struct, :[], :to_ptr
67
+ def_single_delegators :ffi_struct, :ptr
68
+
69
+ # the layout of the GObject struct
70
+ module GObjectLayout
71
+ def self.included(base)
72
+ base.class_eval do
73
+ layout :g_type_instance, :pointer,
74
+ :ref_count, :uint,
75
+ :qdata, :pointer
78
76
  end
77
+ end
78
+ end
79
79
 
80
- # the struct with unref ... manage object lifetime with this
81
- class ManagedStruct < FFI::ManagedStruct
82
- include GObjectLayout
83
-
84
- def initialize(ptr)
85
- log "GLib::GObject::ManagedStruct.new: #{ptr}"
86
- super
87
- end
80
+ # the struct with unref ... manage object lifetime with this
81
+ class ManagedStruct < FFI::ManagedStruct
82
+ include GObjectLayout
88
83
 
89
- def self.release(ptr)
90
- log "GLib::GObject::ManagedStruct.release: unreffing #{ptr}"
91
- GLib::g_object_unref(ptr) unless ptr.null?
92
- end
84
+ def initialize(ptr)
85
+ log "GLib::GObject::ManagedStruct.new: #{ptr}"
86
+ super
87
+ end
93
88
 
94
- end
89
+ def self.release(ptr)
90
+ log "GLib::GObject::ManagedStruct.release: unreffing #{ptr}"
91
+ GLib::g_object_unref(ptr) unless ptr.null?
92
+ end
95
93
 
96
- # the plain struct ... cast with this
97
- class Struct < FFI::Struct
98
- include GObjectLayout
94
+ end
99
95
 
100
- def initialize(ptr)
101
- log "GLib::GObject::Struct.new: #{ptr}"
102
- super
103
- end
96
+ # the plain struct ... cast with this
97
+ class Struct < FFI::Struct
98
+ include GObjectLayout
104
99
 
105
- end
100
+ def initialize(ptr)
101
+ log "GLib::GObject::Struct.new: #{ptr}"
102
+ super
103
+ end
106
104
 
107
- # don't allow ptr == nil, we never want to allocate a GObject struct
108
- # ourselves, we just want to wrap GLib-allocated GObjects
109
- #
110
- # here we use ManagedStruct, not Struct, since this is the ref that will
111
- # need the unref
112
- def initialize(ptr)
113
- log "GLib::GObject.initialize: ptr = #{ptr}"
114
- @struct = ffi_managed_struct.new(ptr)
115
- end
105
+ end
116
106
 
117
- # access to the cast struct for this class
118
- def ffi_struct
119
- self.class.ffi_struct
120
- end
107
+ # don't allow ptr == nil, we never want to allocate a GObject struct
108
+ # ourselves, we just want to wrap GLib-allocated GObjects
109
+ #
110
+ # here we use ManagedStruct, not Struct, since this is the ref that will
111
+ # need the unref
112
+ def initialize(ptr)
113
+ log "GLib::GObject.initialize: ptr = #{ptr}"
114
+ @struct = ffi_managed_struct.new(ptr)
115
+ end
121
116
 
122
- class << self
123
- def ffi_struct
124
- self.const_get(:Struct)
125
- end
126
- end
117
+ # access to the cast struct for this class
118
+ def ffi_struct
119
+ self.class.ffi_struct
120
+ end
127
121
 
128
- # access to the lifetime managed struct for this class
129
- def ffi_managed_struct
130
- self.class.ffi_managed_struct
131
- end
122
+ class << self
123
+ def ffi_struct
124
+ self.const_get(:Struct)
125
+ end
126
+ end
132
127
 
133
- class << self
134
- def ffi_managed_struct
135
- self.const_get(:ManagedStruct)
136
- end
137
- end
128
+ # access to the lifetime managed struct for this class
129
+ def ffi_managed_struct
130
+ self.class.ffi_managed_struct
131
+ end
138
132
 
133
+ class << self
134
+ def ffi_managed_struct
135
+ self.const_get(:ManagedStruct)
136
+ end
139
137
  end
140
138
 
141
- # :gtype will usually be 64-bit, but will be 32-bit on 32-bit Windows
142
- typedef :ulong, :GType
139
+ end
140
+
141
+ # :gtype will usually be 64-bit, but will be 32-bit on 32-bit Windows
142
+ typedef :ulong, :GType
143
143
 
144
144
  end
145
145
 
146
146
  module Vips
147
- extend FFI::Library
148
- ffi_lib 'vips'
147
+ extend FFI::Library
148
+ ffi_lib 'vips'
149
149
 
150
- LOG_DOMAIN = "VIPS"
151
- GLib::set_log_domain(LOG_DOMAIN)
150
+ LOG_DOMAIN = "VIPS"
151
+ GLib::set_log_domain(LOG_DOMAIN)
152
152
 
153
- # need to repeat this
154
- typedef :ulong, :GType
153
+ # need to repeat this
154
+ typedef :ulong, :GType
155
155
 
156
- attach_function :vips_init, [:string], :int
157
- attach_function :vips_shutdown, [], :void
156
+ attach_function :vips_init, [:string], :int
157
+ attach_function :vips_shutdown, [], :void
158
158
 
159
- attach_function :vips_error_buffer, [], :string
160
- attach_function :vips_error_clear, [], :void
159
+ attach_function :vips_error_buffer, [], :string
160
+ attach_function :vips_error_clear, [], :void
161
161
 
162
- def self.get_error
163
- errstr = Vips::vips_error_buffer
164
- Vips::vips_error_clear
165
- errstr
166
- end
167
-
168
- if Vips::vips_init($0) != 0
169
- puts Vips::get_error
170
- exit 1
171
- end
162
+ def self.get_error
163
+ errstr = Vips::vips_error_buffer
164
+ Vips::vips_error_clear
165
+ errstr
166
+ end
172
167
 
173
- at_exit {
174
- Vips::vips_shutdown
175
- }
168
+ if Vips::vips_init($0) != 0
169
+ puts Vips::get_error
170
+ exit 1
171
+ end
176
172
 
177
- attach_function :vips_object_print_all, [], :void
178
- attach_function :vips_leak_set, [:int], :void
173
+ at_exit {
174
+ Vips::vips_shutdown
175
+ }
179
176
 
180
- def self.showall
181
- if $vips_debug
182
- GC.start
183
- vips_object_print_all
184
- end
185
- end
177
+ attach_function :vips_object_print_all, [], :void
178
+ attach_function :vips_leak_set, [:int], :void
186
179
 
180
+ def self.showall
187
181
  if $vips_debug
188
- vips_leak_set 1
182
+ GC.start
183
+ vips_object_print_all
189
184
  end
190
-
191
- class VipsObject < GLib::GObject
192
-
193
- # the layout of the VipsObject struct
194
- module VipsObjectLayout
195
- def self.included(base)
196
- base.class_eval do
197
- # don't actually need most of these, remove them later
198
- layout :parent, GLib::GObject::Struct,
199
- :constructed, :int,
200
- :static_object, :int,
201
- :argument_table, :pointer,
202
- :nickname, :string,
203
- :description, :string,
204
- :preclose, :int,
205
- :close, :int,
206
- :postclose, :int,
207
- :local_memory, :size_t
208
- end
209
- end
185
+ end
186
+
187
+ if $vips_debug
188
+ vips_leak_set 1
189
+ end
190
+
191
+ class VipsObject < GLib::GObject
192
+
193
+ # the layout of the VipsObject struct
194
+ module VipsObjectLayout
195
+ def self.included(base)
196
+ base.class_eval do
197
+ # don't actually need most of these, remove them later
198
+ layout :parent, GLib::GObject::Struct,
199
+ :constructed, :int,
200
+ :static_object, :int,
201
+ :argument_table, :pointer,
202
+ :nickname, :string,
203
+ :description, :string,
204
+ :preclose, :int,
205
+ :close, :int,
206
+ :postclose, :int,
207
+ :local_memory, :size_t
210
208
  end
209
+ end
210
+ end
211
211
 
212
- class Struct < GLib::GObject::Struct
213
- include VipsObjectLayout
214
-
215
- def initialize(ptr)
216
- log "Vips::VipsObject::Struct.new: #{ptr}"
217
- super
218
- end
212
+ class Struct < GLib::GObject::Struct
213
+ include VipsObjectLayout
219
214
 
220
- end
215
+ def initialize(ptr)
216
+ log "Vips::VipsObject::Struct.new: #{ptr}"
217
+ super
218
+ end
221
219
 
222
- class ManagedStruct < GLib::GObject::ManagedStruct
223
- include VipsObjectLayout
220
+ end
224
221
 
225
- def initialize(ptr)
226
- log "Vips::VipsObject::ManagedStruct.new: #{ptr}"
227
- super
228
- end
222
+ class ManagedStruct < GLib::GObject::ManagedStruct
223
+ include VipsObjectLayout
229
224
 
230
- end
225
+ def initialize(ptr)
226
+ log "Vips::VipsObject::ManagedStruct.new: #{ptr}"
227
+ super
228
+ end
231
229
 
232
230
  end
233
231
 
234
- class VipsImage < VipsObject
232
+ end
235
233
 
236
- # the layout of the VipsImage struct
237
- module VipsImageLayout
238
- def self.included(base)
239
- base.class_eval do
240
- layout :parent, VipsObject::Struct
241
- # rest opaque
242
- end
243
- end
244
- end
234
+ class VipsImage < VipsObject
245
235
 
246
- class Struct < VipsObject::Struct
247
- include VipsImageLayout
236
+ # the layout of the VipsImage struct
237
+ module VipsImageLayout
238
+ def self.included(base)
239
+ base.class_eval do
240
+ layout :parent, VipsObject::Struct
241
+ # rest opaque
242
+ end
243
+ end
244
+ end
248
245
 
249
- def initialize(ptr)
250
- log "Vips::VipsImage::Struct.new: #{ptr}"
251
- super
252
- end
246
+ class Struct < VipsObject::Struct
247
+ include VipsImageLayout
253
248
 
254
- end
249
+ def initialize(ptr)
250
+ log "Vips::VipsImage::Struct.new: #{ptr}"
251
+ super
252
+ end
255
253
 
256
- class ManagedStruct < VipsObject::ManagedStruct
257
- include VipsImageLayout
254
+ end
258
255
 
259
- def initialize(ptr)
260
- log "Vips::VipsImage::ManagedStruct.new: #{ptr}"
261
- super
262
- end
256
+ class ManagedStruct < VipsObject::ManagedStruct
257
+ include VipsImageLayout
263
258
 
264
- end
259
+ def initialize(ptr)
260
+ log "Vips::VipsImage::ManagedStruct.new: #{ptr}"
261
+ super
262
+ end
265
263
 
266
- def self.new_partial
267
- VipsImage.new(Vips::vips_image_new)
268
- end
264
+ end
269
265
 
266
+ def self.new_partial
267
+ VipsImage.new(Vips::vips_image_new)
270
268
  end
271
269
 
272
- attach_function :vips_image_new, [], :pointer
270
+ end
271
+
272
+ attach_function :vips_image_new, [], :pointer
273
273
 
274
274
  end
275
275
 
276
276
  puts "creating image"
277
277
  begin
278
- x = Vips::VipsImage.new_partial
279
- puts "x = #{x}"
280
- puts ""
281
- puts "x[:parent] = #{x[:parent]}"
282
- puts ""
283
- puts "x[:parent][:description] = #{x[:parent][:description]}"
284
- puts ""
278
+ x = Vips::VipsImage.new_partial
279
+ puts "x = #{x}"
280
+ puts ""
281
+ puts "x[:parent] = #{x[:parent]}"
282
+ puts ""
283
+ puts "x[:parent][:description] = #{x[:parent][:description]}"
284
+ puts ""
285
285
  end
286
286