workaround exif crash
[booh] / ext / rbbooh.cc
index 29c097d96b1f75466be0ded6ef2059c234e54219..e276442e7c637e9e8ee2f2e8e8bb394e4f5a6356 100644 (file)
@@ -9,7 +9,7 @@
  * called Boo, so this one will be it "Booh". Or whatever.
  *
  *
- * Copyright (c) 2005-2009 Guillaume Cottenceau
+ * Copyright (c) 2005-2010 Guillaume Cottenceau
  *
  * This software may be freely redistributed under the terms of the GNU
  * public license version 2.
@@ -24,6 +24,7 @@
 
 #include <exiv2/image.hpp>
 #include <exiv2/exif.hpp>
+#include <exiv2/error.hpp>
 
 #define GDK_PIXBUF_ENABLE_BACKEND
 #include <gtk/gtk.h>
@@ -34,6 +35,8 @@
 static VALUE whitebalance(VALUE self, VALUE level) {
         double red_filter[256], blue_filter[256];
         int i, x, y;
+        int maxx = gdk_pixbuf_get_width(_SELF(self));
+        int maxy = gdk_pixbuf_get_height(_SELF(self));
         guchar* pixels = gdk_pixbuf_get_pixels(_SELF(self));
         int rowstride = gdk_pixbuf_get_rowstride(_SELF(self));
 
@@ -47,9 +50,9 @@ static VALUE whitebalance(VALUE self, VALUE level) {
                 blue_filter[i] = pow(((double)i)/255, factor) * 255;
         }
     
-        for (y = 0; y < gdk_pixbuf_get_height(_SELF(self)); y++) {
+        for (y = 0; y < maxy; y++) {
                 guchar* pixline = &(pixels[rowstride*y]);
-                for (x = 0; x < gdk_pixbuf_get_width(_SELF(self)); x++) {
+                for (x = 0; x < maxx; x++) {
                         pixline[x*3]   = (guchar) red_filter[pixline[x*3]];
                         pixline[x*3+2] = (guchar) blue_filter[pixline[x*3+2]];
                 }
@@ -61,6 +64,8 @@ static VALUE whitebalance(VALUE self, VALUE level) {
 static VALUE gammacorrect(VALUE self, VALUE level) {
         double filter[256];
         int i, x, y;
+        int maxx = gdk_pixbuf_get_width(_SELF(self));
+        int maxy = gdk_pixbuf_get_height(_SELF(self));
         guchar* pixels = gdk_pixbuf_get_pixels(_SELF(self));
         int rowstride = gdk_pixbuf_get_rowstride(_SELF(self));
 
@@ -73,9 +78,9 @@ static VALUE gammacorrect(VALUE self, VALUE level) {
                 filter[i] = pow(((double)i)/255, factor) * 255;
         }
     
-        for (y = 0; y < gdk_pixbuf_get_height(_SELF(self)); y++) {
+        for (y = 0; y < maxy; y++) {
                 guchar* pixline = &(pixels[rowstride*y]);
-                for (x = 0; x < gdk_pixbuf_get_width(_SELF(self)); x++) {
+                for (x = 0; x < maxx; x++) {
                         pixline[x*3]   = (guchar) filter[pixline[x*3]];
                         pixline[x*3+1] = (guchar) filter[pixline[x*3+1]];
                         pixline[x*3+2] = (guchar) filter[pixline[x*3+2]];
@@ -94,7 +99,7 @@ static VALUE exif_orientation(VALUE module, VALUE filename) {
                         return Qnil;
                 }
                 Exiv2::ExifData::const_iterator i = exifData.findKey(Exiv2::ExifKey("Exif.Image.Orientation"));
-                if (i != exifData.end()) {
+                if (i != exifData.end() && i->count() > 0) {
                         return INT2NUM(i->value().toLong());
                 }
                 return Qnil;
@@ -128,7 +133,7 @@ static VALUE exif_datetimeoriginal(VALUE module, VALUE filename) {
                         return Qnil;
                 }
                 Exiv2::ExifData::const_iterator i = exifData.findKey(Exiv2::ExifKey("Exif.Photo.DateTimeOriginal"));
-                if (i != exifData.end()) {
+                if (i != exifData.end() && i->count() > 0) {
                         return rb_str_new2(i->value().toString().c_str());
                 }
                 return Qnil;