ruby-exiv2 0.1 → 0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/lib/Makefile ADDED
@@ -0,0 +1,143 @@
1
+
2
+ SHELL = /bin/sh
3
+
4
+ #### Start of system configuration section. ####
5
+
6
+ srcdir = .
7
+ topdir = /opt/local/lib/ruby/1.8/i686-darwin8.7.1
8
+ hdrdir = $(topdir)
9
+ VPATH = $(srcdir):$(topdir):$(hdrdir)
10
+ prefix = $(DESTDIR)/opt/local
11
+ exec_prefix = $(DESTDIR)/opt/local
12
+ sitedir = $(prefix)/lib/ruby/site_ruby
13
+ rubylibdir = $(libdir)/ruby/$(ruby_version)
14
+ archdir = $(rubylibdir)/$(arch)
15
+ sbindir = $(exec_prefix)/sbin
16
+ vendordir = $(prefix)/lib/ruby/vendor_ruby
17
+ datadir = $(prefix)/share
18
+ includedir = $(prefix)/include
19
+ infodir = $(prefix)/info
20
+ sysconfdir = $(prefix)/etc
21
+ mandir = $(DESTDIR)/opt/local/share/man
22
+ libdir = $(DESTDIR)/opt/local/lib
23
+ sharedstatedir = $(prefix)/com
24
+ oldincludedir = $(DESTDIR)/usr/include
25
+ sitearchdir = $(sitelibdir)/$(sitearch)
26
+ vendorarchdir = $(vendorlibdir)/$(vendorarch)
27
+ bindir = $(exec_prefix)/bin
28
+ localstatedir = $(prefix)/var
29
+ vendorlibdir = $(vendordir)/$(ruby_version)
30
+ sitelibdir = $(sitedir)/$(ruby_version)
31
+ libexecdir = $(exec_prefix)/libexec
32
+
33
+ CC = gcc
34
+ LIBRUBY = $(LIBRUBY_SO)
35
+ LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a
36
+ LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME)
37
+ LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static
38
+
39
+ CFLAGS = -fno-common -O -pipe -I/opt/local/include -fno-common -pipe -fno-common
40
+ CPPFLAGS = -I. -I$(topdir) -I$(hdrdir) -I$(srcdir) -DHAVE_EXIF_HPP -O -pipe -I/opt/local/include -Wall -I/usr/local/include/exiv2 -I/usr/include/exiv2
41
+ CXXFLAGS = $(CFLAGS)
42
+ DLDFLAGS = -L/opt/local/lib -lstdc++
43
+ LDSHARED = g++ -g -dynamic -bundle -undefined suppress -flat_namespace
44
+ AR = ar
45
+ EXEEXT =
46
+
47
+ RUBY_INSTALL_NAME = ruby
48
+ RUBY_SO_NAME = ruby
49
+ arch = i686-darwin8.7.1
50
+ sitearch = i686-darwin8.7.1
51
+ vendorarch = i686-darwin8.7.1
52
+ ruby_version = 1.8
53
+ ruby = /opt/local/bin/ruby
54
+ RUBY = $(ruby)
55
+ RM = rm -f
56
+ MAKEDIRS = mkdir -p
57
+ INSTALL = /usr/bin/install -c
58
+ INSTALL_PROG = $(INSTALL) -m 0755
59
+ INSTALL_DATA = $(INSTALL) -m 644
60
+ COPY = cp
61
+
62
+ #### End of system configuration section. ####
63
+
64
+ preload =
65
+
66
+ libpath = $(libdir)
67
+ LIBPATH = -L"$(libdir)"
68
+ DEFFILE =
69
+
70
+ CLEANFILES =
71
+ DISTCLEANFILES =
72
+
73
+ extout =
74
+ extout_prefix =
75
+ target_prefix =
76
+ LOCAL_LIBS =
77
+ LIBS = $(LIBRUBYARG_SHARED) -lexiv2 -lpthread -ldl -lobjc
78
+ SRCS = exif.cpp exiv2.cpp image.cpp
79
+ OBJS = exif.o exiv2.o image.o
80
+ TARGET = exiv2
81
+ DLLIB = $(TARGET).bundle
82
+ STATIC_LIB =
83
+
84
+ RUBYCOMMONDIR = $(sitedir)$(target_prefix)
85
+ RUBYLIBDIR = $(sitelibdir)$(target_prefix)
86
+ RUBYARCHDIR = $(sitearchdir)$(target_prefix)
87
+
88
+ TARGET_SO = $(DLLIB)
89
+ CLEANLIBS = $(TARGET).bundle $(TARGET).il? $(TARGET).tds $(TARGET).map
90
+ CLEANOBJS = *.o *.a *.s[ol] *.pdb *.exp *.bak
91
+
92
+ all: $(DLLIB)
93
+ static: $(STATIC_LIB)
94
+
95
+ clean:
96
+ @-$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES)
97
+
98
+ distclean: clean
99
+ @-$(RM) Makefile extconf.h conftest.* mkmf.log
100
+ @-$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES)
101
+
102
+ realclean: distclean
103
+ install: install-so install-rb
104
+
105
+ install-so: $(RUBYARCHDIR)
106
+ install-so: $(RUBYARCHDIR)/$(DLLIB)
107
+ $(RUBYARCHDIR)/$(DLLIB): $(DLLIB)
108
+ $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR)
109
+ install-rb: pre-install-rb install-rb-default
110
+ install-rb-default: pre-install-rb-default
111
+ pre-install-rb: Makefile
112
+ pre-install-rb-default: Makefile
113
+ $(RUBYARCHDIR):
114
+ $(MAKEDIRS) $@
115
+
116
+ site-install: site-install-so site-install-rb
117
+ site-install-so: install-so
118
+ site-install-rb: install-rb
119
+
120
+ .SUFFIXES: .c .m .cc .cxx .cpp .C .o
121
+
122
+ .cc.o:
123
+ $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $<
124
+
125
+ .cxx.o:
126
+ $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $<
127
+
128
+ .cpp.o:
129
+ $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $<
130
+
131
+ .C.o:
132
+ $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $<
133
+
134
+ .c.o:
135
+ $(CC) $(CFLAGS) $(CPPFLAGS) -c $<
136
+
137
+ $(DLLIB): $(OBJS)
138
+ @-$(RM) $@
139
+ $(LDSHARED) $(DLDFLAGS) $(LIBPATH) -o $@ $(OBJS) $(LOCAL_LIBS) $(LIBS)
140
+
141
+
142
+
143
+ $(OBJS): ruby.h defines.h
data/lib/exif.cpp CHANGED
@@ -1,6 +1,77 @@
1
1
  #include "exiv2.hpp"
2
2
 
3
- VALUE exiv2_exif_get(VALUE self, VALUE key) {
3
+
4
+ static VALUE unmarshall_value(const Exiv2::Value& value) {
5
+ if(value.count() <= 0) {
6
+ rb_warn("Empty value (no entries)");
7
+ return Qnil;
8
+ }
9
+
10
+ Exiv2::TypeId type_id = value.typeId();
11
+ switch(type_id) {
12
+ case Exiv2::invalidTypeId:
13
+ {
14
+ rb_warn("Trying to demarshall invalid type id");
15
+ return Qnil;
16
+ }
17
+
18
+ case Exiv2::unsignedByte:
19
+ case Exiv2::unsignedShort:
20
+ case Exiv2::unsignedLong:
21
+ case Exiv2::signedShort:
22
+ case Exiv2::signedLong:
23
+ {
24
+ return INT2NUM(value.toLong());
25
+ }
26
+
27
+ case Exiv2::asciiString:
28
+ case Exiv2::string:
29
+ case Exiv2::undefined:
30
+ {
31
+ VALUE str = rb_str_buf_new(value.size() - 1);
32
+ value.copy((Exiv2::byte *)STR(str), Exiv2::littleEndian);
33
+ LEN(str) = value.size() - 1;
34
+ return str;
35
+ }
36
+
37
+ case Exiv2::unsignedRational:
38
+ case Exiv2::signedRational:
39
+ {
40
+ return rb_str_new2(value.toString().c_str());
41
+ Exiv2::Rational r = value.toRational();
42
+ ID rational_id = rb_intern("Rational");
43
+ if(0 && rb_const_defined(rb_cObject, rational_id)) {
44
+ VALUE rational = rb_const_get(rb_cObject, rational_id);
45
+ return rb_funcall(rational, rb_intern("new!"), 2, INT2NUM(r.first), INT2NUM(r.second));
46
+ }
47
+ return INT2NUM(r.first/r.second);
48
+ }
49
+
50
+ case Exiv2::invalid6:
51
+ case Exiv2::date:
52
+ case Exiv2::time:
53
+ case Exiv2::comment:
54
+ case Exiv2::directory:
55
+ case Exiv2::lastTypeId:
56
+ {
57
+ VALUE str = rb_str_buf_new(value.size() - 1);
58
+ value.copy((Exiv2::byte *)STR(str), Exiv2::littleEndian);
59
+ LEN(str) = value.size() - 1;
60
+ char msg[200];
61
+ snprintf(msg, sizeof(msg), " !!! %d", type_id);
62
+ rb_funcall(str, rb_intern("<<"), 1, rb_str_new2(msg));
63
+ return str;
64
+ }
65
+ }
66
+ return Qfalse;
67
+ }
68
+
69
+ /*
70
+ * Access exif tag by name
71
+ *
72
+ * <code>Exiv2::Image.new("a.jpg").exif["Exif.Image.Model"] => "FinePixS2Pro"</code>
73
+ */
74
+ static VALUE exiv2_exif_get(VALUE self, VALUE key) {
4
75
  __BEGIN
5
76
  rbImage* image;
6
77
  Data_Get_Struct(self, rbImage, image);
@@ -18,12 +89,17 @@ VALUE exiv2_exif_get(VALUE self, VALUE key) {
18
89
  return Qnil;
19
90
  }
20
91
 
21
- std::string v = pos->toString();
22
- return rb_str_new(v.c_str(), v.length());
92
+ return unmarshall_value(pos->value());
93
+ //std::string v = pos->toString();
94
+ //return rb_str_new(v.c_str(), v.length());
23
95
  __NIL_END
24
96
  }
25
97
 
26
- VALUE exiv2_exif_set(VALUE self, VALUE key, VALUE value) {
98
+ /*
99
+ * @exif["Exif.Photo.PixelXDimension"] = 3024
100
+ * [] — is a universal accessor
101
+ */
102
+ static VALUE exiv2_exif_set(VALUE self, VALUE key, VALUE value) {
27
103
  __BEGIN
28
104
  rbImage* image;
29
105
  Data_Get_Struct(self, rbImage, image);
@@ -38,7 +114,10 @@ VALUE exiv2_exif_set(VALUE self, VALUE key, VALUE value) {
38
114
  __NIL_END
39
115
  }
40
116
 
41
- VALUE exiv2_exif_each(int argc, VALUE *argv, VALUE self) {
117
+ /*
118
+ * Iterates through all exif tags in image
119
+ */
120
+ static VALUE exiv2_exif_each(int argc, VALUE *argv, VALUE self) {
42
121
  __BEGIN
43
122
  rbImage* image;
44
123
  Data_Get_Struct(self, rbImage, image);
@@ -54,7 +133,8 @@ VALUE exiv2_exif_each(int argc, VALUE *argv, VALUE self) {
54
133
  Exiv2::ExifData::const_iterator end = exifData.end();
55
134
  for(Exiv2::ExifData::const_iterator i = exifData.begin(); i != end; ++i) {
56
135
  VALUE key = rb_str_new(i->key().c_str(), i->key().length());
57
- VALUE val = rb_str_new(i->toString().c_str(), i->toString().length());
136
+ VALUE val = unmarshall_value(i->value());
137
+ //VALUE val = rb_str_new(i->toString().c_str(), i->toString().length());
58
138
  if(prefix != Qnil && INT2FIX(0) != rb_funcall(key, rb_intern("index"), 1, prefix)) {
59
139
  continue;
60
140
  }
@@ -64,7 +144,10 @@ VALUE exiv2_exif_each(int argc, VALUE *argv, VALUE self) {
64
144
  __END
65
145
  }
66
146
 
67
- VALUE exiv2_exif_delete(VALUE self, VALUE key) {
147
+ /*
148
+ * Delete exif value by it's name
149
+ */
150
+ static VALUE exiv2_exif_delete(VALUE self, VALUE key) {
68
151
  __BEGIN
69
152
  rbImage* image;
70
153
  Data_Get_Struct(self, rbImage, image);
@@ -77,7 +160,7 @@ VALUE exiv2_exif_delete(VALUE self, VALUE key) {
77
160
  }
78
161
 
79
162
  Exiv2::ExifKey exifKey(STR(strkey));
80
- Exiv2::ExifData::const_iterator pos = exifData.findKey(exifKey);
163
+ Exiv2::ExifData::iterator pos = exifData.findKey(exifKey);
81
164
  if (pos == exifData.end()) {
82
165
  return Qnil;
83
166
  }
@@ -88,7 +171,10 @@ VALUE exiv2_exif_delete(VALUE self, VALUE key) {
88
171
  __NIL_END
89
172
  }
90
173
 
91
- VALUE exiv2_exif_clear(VALUE self) {
174
+ /*
175
+ * Clear all exif data in image
176
+ */
177
+ static VALUE exiv2_exif_clear(VALUE self) {
92
178
  __BEGIN
93
179
  rbImage* image;
94
180
  Data_Get_Struct(self, rbImage, image);
@@ -103,8 +189,10 @@ VALUE exiv2_exif_clear(VALUE self) {
103
189
  __END
104
190
  }
105
191
 
106
-
107
- VALUE exiv2_exif_count(VALUE self) {
192
+ /*
193
+ * Count of exif tags in image
194
+ */
195
+ static VALUE exiv2_exif_count(VALUE self) {
108
196
  __BEGIN
109
197
  rbImage* image;
110
198
  Data_Get_Struct(self, rbImage, image);
@@ -115,7 +203,10 @@ VALUE exiv2_exif_count(VALUE self) {
115
203
  __END
116
204
  }
117
205
 
118
- VALUE exiv2_exif_empty(VALUE self) {
206
+ /*
207
+ * Predicate method. Is exif empty?
208
+ */
209
+ static VALUE exiv2_exif_empty(VALUE self) {
119
210
  __BEGIN
120
211
  rbImage* image;
121
212
  Data_Get_Struct(self, rbImage, image);
@@ -124,4 +215,17 @@ VALUE exiv2_exif_empty(VALUE self) {
124
215
 
125
216
  return exifData.empty() ? Qtrue : Qfalse;
126
217
  __NIL_END
218
+ }
219
+
220
+
221
+
222
+ void Init_exif() {
223
+ cExif = rb_define_class_under(mExiv2, "Exif", rb_cObject);
224
+ rb_define_method(cExif, "each", VALUEFUNC(exiv2_exif_each), -1);
225
+ rb_define_method(cExif, "[]", VALUEFUNC(exiv2_exif_get), 1);
226
+ rb_define_method(cExif, "[]=", VALUEFUNC(exiv2_exif_set), 2);
227
+ rb_define_method(cExif, "delete", VALUEFUNC(exiv2_exif_delete), 1);
228
+ rb_define_method(cExif, "clear", VALUEFUNC(exiv2_exif_clear), 0);
229
+ rb_define_method(cExif, "count", VALUEFUNC(exiv2_exif_count), 0);
230
+ rb_define_method(cExif, "empty?", VALUEFUNC(exiv2_exif_empty), 0);
127
231
  }
data/lib/exiv2.cpp CHANGED
@@ -29,7 +29,7 @@
29
29
  #include "exiv2.hpp"
30
30
 
31
31
 
32
- VALUE mExiv2, cImage, cExif, cIptc, cThumbnail;
32
+ VALUE mExiv2, cImage, cExif, cIptc, cThumbnail, eError;
33
33
 
34
34
  #ifdef __cplusplus
35
35
  extern "C"
@@ -39,35 +39,15 @@ extern "C"
39
39
  void Init_exiv2() {
40
40
  mExiv2 = rb_define_module("Exiv2");
41
41
 
42
- cImage = rb_define_class_under(mExiv2, "Image", rb_cObject);
43
- rb_define_alloc_func(cImage, exiv2_image_s_allocate);
44
- rb_define_method(cImage, "initialize", VALUEFUNC(exiv2_image_initialize), 1);
45
- rb_define_method(cImage, "exif", VALUEFUNC(exiv2_image_exif), 0);
46
- /*
47
- rb_define_method(cImage, "thumbnail", VALUEFUNC(exiv2_image_thumbnail), 0);
48
- rb_define_method(cImage, "thumbnail=", VALUEFUNC(exiv2_image_thumbnail_set), 0);
49
- */
50
- rb_define_method(cImage, "save", VALUEFUNC(exiv2_image_save), 0);
51
- rb_define_method(cImage, "clear", VALUEFUNC(exiv2_image_clear), 0);
52
- rb_define_method(cImage, "comment", VALUEFUNC(exiv2_image_get_comment), 0);
53
- rb_define_method(cImage, "comment=", VALUEFUNC(exiv2_image_set_comment), 1);
42
+ eError = rb_define_class_under(mExiv2, "Error", rb_eStandardError);
54
43
 
55
- cExif = rb_define_class_under(mExiv2, "Exif", rb_cObject);
56
- rb_define_method(cExif, "each", VALUEFUNC(exiv2_exif_each), -1);
57
- rb_define_method(cExif, "[]", VALUEFUNC(exiv2_exif_get), 1);
58
- rb_define_method(cExif, "[]=", VALUEFUNC(exiv2_exif_set), 2);
59
- rb_define_method(cExif, "delete", VALUEFUNC(exiv2_exif_delete), 1);
60
- rb_define_method(cExif, "clear", VALUEFUNC(exiv2_exif_clear), 0);
61
- rb_define_method(cExif, "size", VALUEFUNC(exiv2_exif_size), 0);
62
- rb_define_method(cExif, "empty?", VALUEFUNC(exiv2_exif_empty), 0);
63
-
64
- /*
65
- cThumbnail = rb_define_class_under(mExiv2, "Thumbnail", rb_cObject);
66
- rb_define_method(cThumbnail, "extension", VALUEFUNC(exiv2_thumb_ext), 0);
67
- rb_define_method(cThumbnail, "format", VALUEFUNC(exiv2_thumb_format), 0);
68
- rb_define_method(cThumbnail, "clear", VALUEFUNC(exiv2_thumb_clear), 0);
69
- rb_define_method(cThumbnail, "to_s", VALUEFUNC(exiv2_thumb_read), 0);
70
- rb_define_method(cThumbnail, "read", VALUEFUNC(exiv2_thumb_read), 0);
71
- rb_define_method(cThumbnail, "write", VALUEFUNC(exiv2_thumb_write), 1);
72
- */
44
+ Init_image();
45
+ Init_exif();
46
+ //cThumbnail = rb_define_class_under(mExiv2, "Thumbnail", rb_cObject);
47
+ //rb_define_method(cThumbnail, "extension", VALUEFUNC(exiv2_thumb_ext), 0);
48
+ //rb_define_method(cThumbnail, "format", VALUEFUNC(exiv2_thumb_format), 0);
49
+ //rb_define_method(cThumbnail, "clear", VALUEFUNC(exiv2_thumb_clear), 0);
50
+ //rb_define_method(cThumbnail, "to_s", VALUEFUNC(exiv2_thumb_read), 0);
51
+ //rb_define_method(cThumbnail, "read", VALUEFUNC(exiv2_thumb_read), 0);
52
+ //rb_define_method(cThumbnail, "write", VALUEFUNC(exiv2_thumb_write), 1);
73
53
  }
data/lib/exiv2.hpp CHANGED
@@ -77,7 +77,7 @@
77
77
  #define RUN(x) if(!x) { return Qnil; }
78
78
 
79
79
  #define __BEGIN try {
80
- #define __END } catch(Exiv2::AnyError& e) { rb_raise(rb_eStandardError, "Error occured in exiv2 library: %s", e.what().c_str());}
80
+ #define __END } catch(Exiv2::AnyError& e) { rb_raise(eError, "Error occured in exiv2 library: %s", e.what().c_str());}
81
81
  #define __NIL_END } catch(Exiv2::AnyError& e) { return Qnil; }
82
82
  #define __VOID_END } catch(Exiv2::AnyError& e) {}
83
83
 
@@ -85,7 +85,7 @@
85
85
  extern "C" {
86
86
  #endif
87
87
  void Init_exiv2(void);
88
- extern VALUE mExiv2, cImage, cExif, cIptc;
88
+ extern VALUE mExiv2, cImage, cExif, cIptc, eError;
89
89
 
90
90
  #if defined(__cplusplus)
91
91
  } /* extern "C" { */
@@ -98,21 +98,8 @@ struct rbImage {
98
98
  };
99
99
 
100
100
 
101
- VALUE exiv2_image_s_allocate(VALUE klass);
102
- VALUE exiv2_image_initialize(VALUE self, VALUE file);
103
- VALUE exiv2_image_save(VALUE self);
104
- VALUE exiv2_image_clear(VALUE self);
105
- VALUE exiv2_image_exif(VALUE self);
106
- VALUE exiv2_image_get_comment(VALUE self);
107
- VALUE exiv2_image_set_comment(VALUE self, VALUE comment);
108
-
109
- VALUE exiv2_exif_get(VALUE self, VALUE key);
110
- VALUE exiv2_exif_set(VALUE self, VALUE key, VALUE value);
111
- VALUE exiv2_exif_each(int argc, VALUE *argv, VALUE self);
112
- VALUE exiv2_exif_delete(VALUE self, VALUE key);
113
- VALUE exiv2_exif_size(VALUE self);
114
- VALUE exiv2_exif_empty(VALUE self);
115
- VALUE exiv2_exif_clear(VALUE self);
101
+ void Init_image();
102
+ void Init_exif();
116
103
 
117
104
 
118
105
  #endif /* EXIV2_HPP_ */
data/lib/extconf.rb CHANGED
@@ -6,8 +6,8 @@ CONFIG['LDSHARED'] = "g++ -g -dynamic -bundle -undefined suppress -flat_namespa
6
6
 
7
7
 
8
8
 
9
- $CPPFLAGS << " -Wall -I/usr/local/include/exiv2 "
10
- $LDFLAGS << " -lstdc++ -L/usr/local/lib "
9
+ $CPPFLAGS << " -Wall -I/usr/local/include/exiv2 -I/usr/include/exiv2 "
10
+ $LDFLAGS << " -lstdc++ "
11
11
  have_header "exif.hpp"
12
12
  have_library "exiv2", "_ZN5Exiv29MetadatumD0Ev"
13
13
  create_makefile 'exiv2'
data/lib/image.cpp CHANGED
@@ -13,7 +13,7 @@ static void image_leave(rbImage* image) {
13
13
 
14
14
  }
15
15
 
16
- VALUE exiv2_image_s_allocate(VALUE klass) {
16
+ static VALUE exiv2_image_s_allocate(VALUE klass) {
17
17
  __BEGIN
18
18
  rbImage* image = new rbImage();
19
19
  image->dirty = false;
@@ -21,7 +21,11 @@ VALUE exiv2_image_s_allocate(VALUE klass) {
21
21
  __END
22
22
  }
23
23
 
24
- VALUE exiv2_image_initialize(VALUE self, VALUE file) {
24
+ /*
25
+ * img = Exiv2::Image.new("IMGP3025.jpg")
26
+ * => #<Exiv2::Image:0x844bc>
27
+ */
28
+ static VALUE exiv2_image_initialize(VALUE self, VALUE file) {
25
29
  __BEGIN
26
30
  rbImage* image;
27
31
  Data_Get_Struct(self, rbImage, image);
@@ -30,7 +34,7 @@ VALUE exiv2_image_initialize(VALUE self, VALUE file) {
30
34
  try {
31
35
  if(rb_respond_to(file, rb_intern("read"))) {
32
36
  VALUE file_content = rb_funcall(file, rb_intern("read"), 0);
33
- rb_iv_set(self, "file_content", file_content);
37
+ rb_iv_set(self, "@file_content", file_content);
34
38
  image->image = Exiv2::ImageFactory::open(CBSTR(file_content), LEN(file_content));
35
39
  } else if(TYPE(file) == T_STRING) {
36
40
  image->image = Exiv2::ImageFactory::open(CSTR(file));
@@ -52,7 +56,10 @@ static void image_real_save(rbImage* image) {
52
56
  }
53
57
  }
54
58
 
55
- VALUE exiv2_image_save(VALUE self) {
59
+ /*
60
+ * Save image with changed data
61
+ */
62
+ static VALUE exiv2_image_save(VALUE self) {
56
63
  __BEGIN
57
64
  rbImage* image;
58
65
  Data_Get_Struct(self, rbImage, image);
@@ -61,8 +68,10 @@ VALUE exiv2_image_save(VALUE self) {
61
68
  __END
62
69
  }
63
70
 
64
-
65
- VALUE exiv2_image_clear(VALUE self) {
71
+ /*
72
+ * Clear all metadata in image. Not only exif
73
+ */
74
+ static VALUE exiv2_image_clear(VALUE self) {
66
75
  __BEGIN
67
76
  rbImage* image;
68
77
  Data_Get_Struct(self, rbImage, image);
@@ -72,8 +81,10 @@ VALUE exiv2_image_clear(VALUE self) {
72
81
  __END
73
82
  }
74
83
 
75
-
76
- VALUE exiv2_image_get_comment(VALUE self) {
84
+ /*
85
+ * Get comment of image
86
+ */
87
+ static VALUE exiv2_image_get_comment(VALUE self) {
77
88
  __BEGIN
78
89
  rbImage* image;
79
90
  Data_Get_Struct(self, rbImage, image);
@@ -82,7 +93,10 @@ VALUE exiv2_image_get_comment(VALUE self) {
82
93
  __END
83
94
  }
84
95
 
85
- VALUE exiv2_image_set_comment(VALUE self, VALUE comment) {
96
+ /*
97
+ * Set comment in image
98
+ */
99
+ static VALUE exiv2_image_set_comment(VALUE self, VALUE comment) {
86
100
  __BEGIN
87
101
  rbImage* image;
88
102
  Data_Get_Struct(self, rbImage, image);
@@ -105,8 +119,10 @@ VALUE exiv2_image_set_comment(VALUE self, VALUE comment) {
105
119
  __END
106
120
  }
107
121
 
108
-
109
- VALUE exiv2_image_exif(VALUE self) {
122
+ /*
123
+ * Access to exif data of image
124
+ */
125
+ static VALUE exiv2_image_exif(VALUE self) {
110
126
  __BEGIN
111
127
  rbImage* image;
112
128
  Data_Get_Struct(self, rbImage, image);
@@ -116,3 +132,17 @@ VALUE exiv2_image_exif(VALUE self) {
116
132
  __END
117
133
  }
118
134
 
135
+ void Init_image() {
136
+ cImage = rb_define_class_under(mExiv2, "Image", rb_cObject);
137
+ rb_define_alloc_func(cImage, exiv2_image_s_allocate);
138
+ rb_define_method(cImage, "initialize", VALUEFUNC(exiv2_image_initialize), 1);
139
+ rb_define_method(cImage, "exif", VALUEFUNC(exiv2_image_exif), 0);
140
+
141
+ //rb_define_method(cImage, "thumbnail", VALUEFUNC(exiv2_image_thumbnail), 0);
142
+ //rb_define_method(cImage, "thumbnail=", VALUEFUNC(exiv2_image_thumbnail_set), 0);
143
+
144
+ rb_define_method(cImage, "save", VALUEFUNC(exiv2_image_save), 0);
145
+ rb_define_method(cImage, "clear", VALUEFUNC(exiv2_image_clear), 0);
146
+ rb_define_method(cImage, "comment", VALUEFUNC(exiv2_image_get_comment), 0);
147
+ rb_define_method(cImage, "comment=", VALUEFUNC(exiv2_image_set_comment), 1);
148
+ }
data/test/image.rb CHANGED
@@ -2,9 +2,10 @@ require 'test/unit'
2
2
  require File.dirname(__FILE__) + '/../lib/exiv2'
3
3
  require 'tempfile'
4
4
 
5
+
5
6
  class ImageTest < Test::Unit::TestCase
6
7
 
7
- def test_file(filename)
8
+ def open_test_file(filename)
8
9
  test_file_name = File.dirname(__FILE__) + "/data/file_test"
9
10
  open(test_file_name, "w+") do |f|
10
11
  open(File.dirname(__FILE__) + "/data/#{filename}") do |real|
@@ -19,8 +20,15 @@ class ImageTest < Test::Unit::TestCase
19
20
  end
20
21
 
21
22
  def test_open
22
- test_file "exiv2-fujifilm-finepix-s2pro.jpg" do |f|
23
- assert @img = Exiv2::Image.new(f)
23
+ open_test_file "exiv2-fujifilm-finepix-s2pro.jpg" do |f|
24
+ assert @img = Exiv2::Image.new(f), "Image should be opened from IO::File"
25
+ assert_equal "FinePixS2Pro", @img.exif["Exif.Image.Model"]
26
+ assert_equal nil, @img.exif["zeze"]
27
+ assert_equal "3024", @img.exif["Exif.Photo.PixelXDimension"]
28
+ end
29
+
30
+ open_test_file "exiv2-fujifilm-finepix-s2pro.jpg" do |f|
31
+ assert @img = Exiv2::Image.new(f.path), "Image should be opened from filename"
24
32
  assert_equal "FinePixS2Pro", @img.exif["Exif.Image.Model"]
25
33
  assert_equal nil, @img.exif["zeze"]
26
34
  assert_equal "3024", @img.exif["Exif.Photo.PixelXDimension"]
@@ -28,8 +36,9 @@ class ImageTest < Test::Unit::TestCase
28
36
  end
29
37
 
30
38
  def test_write
31
- test_file "exiv2-fujifilm-finepix-s2pro.jpg" do |f|
39
+ open_test_file "exiv2-fujifilm-finepix-s2pro.jpg" do |f|
32
40
  assert @img = Exiv2::Image.new(f)
41
+ assert_equal "FinePixS2Pro", @img.exif["Exif.Image.Model"]
33
42
  assert_equal "*istDs", @img.exif["Exif.Image.Model"] = "*istDs"
34
43
  assert @img.save
35
44
 
@@ -39,7 +48,7 @@ class ImageTest < Test::Unit::TestCase
39
48
  end
40
49
 
41
50
  def test_comment
42
- test_file "exiv2-fujifilm-finepix-s2pro.jpg" do |f|
51
+ open_test_file "exiv2-fujifilm-finepix-s2pro.jpg" do |f|
43
52
  assert @img = Exiv2::Image.new(f)
44
53
  assert_equal "My funny comment", @img.comment = "My funny comment"
45
54
  assert @img.save
@@ -48,13 +57,32 @@ class ImageTest < Test::Unit::TestCase
48
57
  assert_equal "My funny comment", @img.comment
49
58
  end
50
59
  end
60
+
61
+ def test_typehinting
62
+ open_test_file "exiv2-fujifilm-finepix-s2pro.jpg" do |f|
63
+ assert @img = Exiv2::Image.new(f)
64
+ assert @exif = @img.exif
65
+ assert_equal 1, @exif["Exif.Image.Orientation"]
66
+ assert_equal "Digital Camera FinePixS2Pro Ver1.00", @exif["Exif.Image.Software"]
67
+ assert_equal 72, @exif["Exif.Image.XResolution"]
68
+ assert_equal String, @exif["Exif.Image.XResolution"].class
69
+ puts @exif["Exif.Image.XResolution"].class
70
+
71
+ require 'rational'
72
+
73
+ assert_equal 72, @exif["Exif.Image.XResolution"]
74
+ assert_equal Numeric, @exif["Exif.Image.XResolution"].class
75
+ puts @exif["Exif.Image.XResolution"].class
76
+ end
77
+ end
51
78
 
52
79
  def test_each
53
- test_file "exiv2-fujifilm-finepix-s2pro.jpg" do |f|
80
+ open_test_file "exiv2-fujifilm-finepix-s2pro.jpg" do |f|
54
81
  assert @img = Exiv2::Image.new(f)
55
82
  i = 0
56
83
  @img.exif.each do |key, value|
57
84
  i = i + 1
85
+ #puts "#{key} => #{value.inspect}"
58
86
  assert key
59
87
  assert value
60
88
  end
metadata CHANGED
@@ -3,13 +3,13 @@ rubygems_version: 0.8.11
3
3
  specification_version: 1
4
4
  name: ruby-exiv2
5
5
  version: !ruby/object:Gem::Version
6
- version: "0.1"
7
- date: 2006-09-20 00:00:00 +04:00
8
- summary: Exiv2 library ruby driver
6
+ version: "0.2"
7
+ date: 2006-10-30 00:00:00 +03:00
8
+ summary: Exiv2 (exif image tags handling) library driver
9
9
  require_paths:
10
10
  - lib
11
11
  email: max@maxidoors.ru
12
- homepage: http://rubyforge.org/project/ruby-exiv2/
12
+ homepage: http://maxidoors.ru/
13
13
  rubyforge_project: ruby-exiv2
14
14
  description:
15
15
  autorequire: intersys
@@ -36,13 +36,14 @@ files:
36
36
  - lib/exiv2.hpp
37
37
  - lib/extconf.rb
38
38
  - lib/image.cpp
39
+ - lib/Makefile
39
40
  - README
40
41
  test_files: []
41
42
 
42
43
  rdoc_options:
43
44
  - --main=README
44
45
  - --line-numbers
45
- - --webcvs=svn+ssh://max_lapshin@rubyforge.org/var/svn/ruby-exiv2
46
+ - --webcvs=http://svn.maxidoors.ru/ruby-exiv2
46
47
  - --charset=utf-8
47
48
  - --promiscuous
48
49
  extra_rdoc_files:
@@ -53,5 +54,13 @@ extensions:
53
54
  - lib/extconf.rb
54
55
  requirements: []
55
56
 
56
- dependencies: []
57
-
57
+ dependencies:
58
+ - !ruby/object:Gem::Dependency
59
+ name: activesupport
60
+ version_requirement:
61
+ version_requirements: !ruby/object:Gem::Version::Requirement
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ version: "1.0"
66
+ version: