Index: includes/image.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/image.inc,v
retrieving revision 1.33
diff -u -p -r1.33 image.inc
--- includes/image.inc	20 Apr 2009 20:02:30 -0000	1.33
+++ includes/image.inc	12 Aug 2009 22:00:53 -0000
@@ -99,38 +99,58 @@ function image_toolkit_invoke($method, s
 }
 
 /**
+ * Retrieve the extensions supported by a toolkit
+ *
+ * @param $toolkit
+ *   An image toolkit name.
+ * @return
+ *   Array containing extensions supported by the toolkit.
+ */
+function image_get_toolkit_extensions($toolkit) {
+  $function = 'image_' . $toolkit . '_get_toolkit_extensions';
+  if (drupal_function_exists($function)) {
+    return call_user_func_array($function, array());
+  }
+  return FALSE;
+}
+
+/**
  * Get details about an image.
  *
- * Drupal only supports GIF, JPG and PNG file formats.
+ * Drupal supports GIF, JPG and PNG file formats, and may support 
+ * others depending on which toolkits are installed.
  *
  * @param $filepath
  *   String specifying the path of the image file.
+ * @param $toolkit
+ *   An optional, image toolkit name to override the default.
  * @return
  *   FALSE, if the file could not be found or is not an image. Otherwise, a
  *   keyed array containing information about the image:
  *    'width'     - Width, in pixels.
  *    'height'    - Height, in pixels.
  *    'extension' - Commonly used file extension for the image.
- *    'mime_type' - MIME type ('image/jpeg', 'image/gif', 'image/png').
+ *    'mime_type' - MIME type, e.g. 'image/jpeg', 'image/gif', 'image/png'.
  *    'file_size' - File size in bytes.
  */
-function image_get_info($filepath) {
+function image_get_info($filepath, $toolkit = FALSE) {
   if (!is_file($filepath)) {
     return FALSE;
   }
 
   $details = FALSE;
-  $data = @getimagesize($filepath);
-  $file_size = @filesize($filepath);
 
-  if (isset($data) && is_array($data)) {
-    $extensions = array('1' => 'gif', '2' => 'jpg', '3' => 'png');
-    $extension = array_key_exists($data[2], $extensions) ?  $extensions[$data[2]] : '';
-    $details = array('width'     => $data[0],
-                     'height'    => $data[1],
-                     'extension' => $extension,
-                     'file_size' => $file_size,
-                     'mime_type' => $data['mime']);
+  if (!$toolkit) {
+    $toolkit = image_get_toolkit();
+  }
+  if ($toolkit) {
+    $image = new stdClass();
+    $image->source = $filepath;
+    $image->toolkit = $toolkit;
+    $details = image_toolkit_invoke('get_info', $image);
+    if (isset($details) && is_array($details)) {
+      $details['file_size'] = @filesize($filepath);
+    }
   }
 
   return $details;
@@ -343,10 +363,12 @@ function image_load($file, $toolkit = FA
   if ($toolkit) {
     $image = new stdClass();
     $image->source = $file;
-    $image->info = image_get_info($file);
-    $image->toolkit = $toolkit;
-    if (image_toolkit_invoke('load', $image)) {
-      return $image;
+    $image->info = image_get_info($file, $toolkit); 
+    if (isset($image->info) && is_array($image->info)) {
+      $image->toolkit = $toolkit;
+      if (image_toolkit_invoke('load', $image)) {
+        return $image;
+      }
     }
   }
   return FALSE;
@@ -374,7 +396,7 @@ function image_save(stdClass $image, $de
   if ($return = image_toolkit_invoke('save', $image, array($destination))) {
     // Clear the cached file size and refresh the image information.
     clearstatcache();
-    $image->info = image_get_info($destination);
+    $image->info = image_get_info($destination, $image->toolkit);
 
     if (drupal_chmod($destination)) {
       return $return;
Index: modules/simpletest/tests/image.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/image.test,v
retrieving revision 1.6
diff -u -p -r1.6 image.test
--- modules/simpletest/tests/image.test	13 Jul 2009 21:51:41 -0000	1.6
+++ modules/simpletest/tests/image.test	12 Aug 2009 22:00:55 -0000
@@ -96,7 +96,7 @@ class ImageToolkitUnitTest extends Image
     $image = image_load($this->file, $this->toolkit);
     $this->assertTrue(is_object($image), t('Returned an object.'));
     $this->assertEqual($this->toolkit, $image->toolkit, t('Image had toolkit set.'));
-    $this->assertToolkitOperationsCalled(array('load'));
+    $this->assertToolkitOperationsCalled(array('load', 'get_info'));
   }
 
   /**
Index: modules/simpletest/tests/image_test.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/image_test.module,v
retrieving revision 1.3
diff -u -p -r1.3 image_test.module
--- modules/simpletest/tests/image_test.module	27 May 2009 18:34:00 -0000	1.3
+++ modules/simpletest/tests/image_test.module	12 Aug 2009 22:00:55 -0000
@@ -58,8 +58,8 @@ function image_test_get_all_calls() {
  * Store the values passed to a toolkit call.
  *
  * @param $op
- *   One of the image toolkit operations: 'load', 'save', 'settings', 'resize',
- *   'rotate', 'crop', 'desaturate'.
+ *   One of the image toolkit operations: 'get_info', 'load', 'save', 
+ *   'settings', 'resize', 'rotate', 'crop', 'desaturate'.
  * @param $args
  *   Values passed to hook.
  * @see image_test_get_all_calls()
@@ -80,6 +80,14 @@ function image_test_settings() {
 }
 
 /**
+ * Image tookit's get_info operation.
+ */
+function image_test_get_info(stdClass $image) {
+  _image_test_log_call('get_info', array($image));
+  return array();
+}
+
+/**
  * Image tookit's load operation.
  */
 function image_test_load(stdClass $image) {
Index: modules/system/image.gd.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/image.gd.inc,v
retrieving revision 1.7
diff -u -p -r1.7 image.gd.inc
--- modules/system/image.gd.inc	21 Jul 2009 00:07:41 -0000	1.7
+++ modules/system/image.gd.inc	12 Aug 2009 22:00:55 -0000
@@ -316,5 +316,60 @@ function image_gd_create_tmp(stdClass $i
 }
 
 /**
+ * Retrieve the extensions supported by the toolkit
+ *
+ * @return
+ *   Array containing extensions supported by the toolkit.
+ */
+function image_gd_get_toolkit_extensions() {
+  $info = gd_info();
+  if ($info['GIF Read Support'] && $info['GIF Create Support']) {
+    $extensions[1] = 'gif';
+  }
+  if (isset($info['JPEG Support']) && $info['JPEG Support']) {
+    $extensions[2] = 'jpg';
+  }
+  if (isset($info['JPG Support']) && $info['JPG Support']) {
+    $extensions[2] = 'jpg';
+  }
+  if ($info['PNG Support']) {
+    $extensions[3] = 'png';
+  }
+
+  return $extensions;
+}
+
+/**
+ * Get details about an image.
+ *
+ * @param $image
+ *   An image object.
+ * @return
+ *   FALSE, if the file could not be found or is not an image. Otherwise, a
+ *   keyed array containing information about the image:
+ *    'width'     - Width, in pixels.
+ *    'height'    - Height, in pixels.
+ *    'extension' - Commonly used file extension for the image.
+ *    'mime_type' - MIME type ('image/jpeg', 'image/gif', 'image/png').
+ *
+ * @see image_get_info()
+ */
+function image_gd_get_info(stdClass $image) {
+  $details = FALSE;
+  $data = @getimagesize($image->source);
+
+  if (isset($data) && is_array($data)) {
+    $extensions = image_gd_get_toolkit_extensions();
+    $extension = array_key_exists($data[2], $extensions) ?  $extensions[$data[2]] : '';
+    $details = array('width'     => $data[0],
+                     'height'    => $data[1],
+                     'extension' => $extension,
+                     'mime_type' => $data['mime']);
+  }
+
+  return $details;
+}
+
+/**
  * @} End of "ingroup image".
  */
