Index: includes/image.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/image.inc,v
retrieving revision 1.21
diff -u -p -r1.21 image.inc
--- includes/image.inc	12 May 2007 05:51:20 -0000	1.21
+++ includes/image.inc	6 Jun 2007 09:21:46 -0000
@@ -2,45 +2,45 @@
 // $Id: image.inc,v 1.21 2007/05/12 05:51:20 dries Exp $
 
 /**
- * Return a list of available toolkits.
+ * Return a list of *all* available toolkits.
  *
  * @return An array of toolkit name => descriptive title.
  */
-function image_get_available_toolkits() {
-  $toolkits = file_scan_directory('includes', 'image\..*\.inc$');
 
-  $output = array();
-  foreach ($toolkits as $file => $toolkit) {
-    include_once "./$file";
-    $function = str_replace('.', '_', $toolkit->name) .'_info';
-    if (function_exists($function)) {
-      $info = $function();
-      $output[$info['name']] = $info['title'];
+function image_get_toolkits() {
+  if ($toolkits = module_invoke_all('toolkit_info')) {
+    foreach($toolkits as $key => $toolkit) {
+      $output[$key] = $toolkit['title'];
     }
+    return $output;
+  }
+  else {
+    return FALSE;
   }
-  $output['gd'] = t('Built-in GD2 toolkit');
-  return $output;
 }
 
 /**
- * Retrieve the name of the currently used toolkit.
- *
+ * Retrieve the name of the currently used toolkit, and check the 
+ * existence of it. If the toolkit is corrupt, or deleted we fall back
+ * to GD.
+ * 
  * @return String containing the name of the toolkit.
  */
 function image_get_toolkit() {
-  static $toolkit;
-  if (!$toolkit) {
-    $toolkit = variable_get('image_toolkit', 'gd');
-    $toolkit_file = './includes/image.'. $toolkit .'.inc';
-    if ($toolkit != 'gd' && file_exists($toolkit_file)) {
-      include_once $toolkit_file;
-    }
-    elseif (!image_gd_check_settings()) {
-      $toolkit = FALSE;
-    }
-  }
+  $toolkit = variable_get('image_toolkit', 'gd');
+  $toolkit_check = file_exists(drupal_get_path('module', $toolkit). "/$toolkit.module");
 
-  return $toolkit;
+  // Check existence of the image toolkit
+  if (isset($toolkit) && ($toolkit_check)) {
+    // The toolkit is found, let's use it
+    return $toolkit;
+  }
+  // The toolkit isn't found, fall back to GD2 support
+  else {
+    $toolkit = 'gd';
+    variable_set('image_toolkit', $toolkit);
+    return $toolkit;
+  }
 }
 
 /**
@@ -53,23 +53,17 @@ function image_get_toolkit() {
  */
 function image_toolkit_invoke($method, $params = array()) {
   if ($toolkit = image_get_toolkit()) {
-    $function = 'image_'. $toolkit .'_'. $method;
+    $function = $toolkit .'_'. $method;
     if (function_exists($function)) {
       return call_user_func_array($function, $params);
     }
     else {
-      watchdog('php', 'The selected image handling toolkit %toolkit can not correctly process %function.', array('%toolkit' => $toolkit, '%function' => $function), WATCHDOG_ERROR);
+      watchdog('php', t('The selected image handling toolkit %toolkit can not correctly process %function.', array('%toolkit' => $toolkit, '%function' => $function)), WATCHDOG_ERROR);
       return FALSE;
     }
   }
-  else {
-    if ($method == 'settings') {
-      return image_gd_settings();
-    }
-  }
 }
 
-
 /**
  * Get details about an image.
  *
@@ -199,160 +193,4 @@ function image_rotate($source, $destinat
  */
 function image_crop($source, $destination, $x, $y, $width, $height) {
   return image_toolkit_invoke('crop', array($source, $destination, $x, $y, $width, $height));
-}
-
-/**
- * GD2 toolkit functions
- * With the minimal requirements of PHP 4.3 for Drupal, we use the built-in version of GD.
- */
-
-/**
- * Retrieve settings for the GD2 toolkit.
- */
-function image_gd_settings() {
-  if (image_gd_check_settings()) {
-    $form = array();
-    $form['status'] = array('#value' => t('The built-in GD2 toolkit is installed and working properly.'));
-
-    $form['image_jpeg_quality'] = array(
-      '#type' => 'textfield',
-      '#title' => t('JPEG quality'),
-      '#description' => t('Define the image quality for JPEG manipulations. Ranges from 0 to 100. Higher values mean better image quality but bigger files.'),
-      '#size' => 10,
-      '#maxlength' => 3,
-      '#default_value' => variable_get('image_jpeg_quality', 75),
-      '#field_suffix' => t('%'),
-    );
-
-    return $form;
-  }
-  else {
-    form_set_error('image_toolkit', t('The built-in GD image toolkit requires that the GD module for PHP be installed and configured properly. For more information see <a href="@url">PHP\'s image documentation</a>.', array('@url' => 'http://php.net/image')));
-    return FALSE;
-  }
-}
-
-/**
- * Verify GD2 settings (that the right version is actually installed).
- *
- * @return boolean
- */
-function image_gd_check_settings() {
-  if ($check = get_extension_funcs('gd')) {
-    if (in_array('imagegd2', $check)) {
-      // GD2 support is available.
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-
-/**
- * Scale an image to the specified size using GD.
- */
-function image_gd_resize($source, $destination, $width, $height) {
-  if (!file_exists($source)) {
-    return FALSE;
-  }
-
-  $info = image_get_info($source);
-  if (!$info) {
-    return FALSE;
-  }
-
-  $im = image_gd_open($source, $info['extension']);
-  if (!$im) {
-    return FALSE;
-  }
-
-  $res = imageCreateTrueColor($width, $height);
-  if ($info['extension'] == 'png') {
-    $transparency = imagecolorallocatealpha($res, 0, 0, 0, 127);
-    imagealphablending($res, FALSE);
-    imagefilledrectangle($res, 0, 0, $width, $height, $transparency);
-    imagealphablending($res, TRUE);
-    imagesavealpha($res, TRUE);
-  }
-  imageCopyResampled($res, $im, 0, 0, 0, 0, $width, $height, $info['width'], $info['height']);
-  $result = image_gd_close($res, $destination, $info['extension']);
-
-  imageDestroy($res);
-  imageDestroy($im);
-
-  return $result;
-}
-
-/**
- * Rotate an image the given number of degrees.
- */
-function image_gd_rotate($source, $destination, $degrees, $bg_color = 0) {
-  if (!function_exists('imageRotate')) {
-    return FALSE;
-  }
-
-  $info = image_get_info($source);
-  if (!$info) {
-    return FALSE;
-  }
-
-  $im = image_gd_open($source, $info['extension']);
-  if (!$im) {
-    return FALSE;
-  }
-
-  $res = imageRotate($im, $degrees, $bg_color);
-  $result = image_gd_close($res, $destination, $info['extension']);
-
-  return $result;
-}
-
-/**
- * Crop an image using the GD toolkit.
- */
-function image_gd_crop($source, $destination, $x, $y, $width, $height) {
-  $info = image_get_info($source);
-  if (!$info) {
-    return FALSE;
-  }
-
-  $im = image_gd_open($source, $info['extension']);
-  $res = imageCreateTrueColor($width, $height);
-  imageCopy($res, $im, 0, 0, $x, $y, $width, $height);
-  $result = image_gd_close($res, $destination, $info['extension']);
-
-  imageDestroy($res);
-  imageDestroy($im);
-
-  return $result;
-}
-
-/**
- * GD helper function to create an image resource from a file.
- */
-function image_gd_open($file, $extension) {
-  $extension = str_replace('jpg', 'jpeg', $extension);
-  $open_func = 'imageCreateFrom'. $extension;
-  if (!function_exists($open_func)) {
-    return FALSE;
-  }
-  return $open_func($file);
-}
-
-/**
- * GD helper to write an image resource to a destination file.
- */
-function image_gd_close($res, $destination, $extension) {
-  $extension = str_replace('jpg', 'jpeg', $extension);
-  $close_func = 'image'. $extension;
-  if (!function_exists($close_func)) {
-    return FALSE;
-  }
-  if ($extension == 'jpeg') {
-    return $close_func($res, $destination, variable_get('image_jpeg_quality', 75));
-  }
-  else {
-    return $close_func($res, $destination);
-  }
-}
-
-
+}
\ No newline at end of file
Index: includes/module.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/module.inc,v
retrieving revision 1.102
diff -u -p -r1.102 module.inc
--- includes/module.inc	25 May 2007 12:46:43 -0000	1.102
+++ includes/module.inc	6 Jun 2007 09:21:46 -0000
@@ -419,5 +419,5 @@ function module_invoke_all() {
  * Array of modules required by core.
  */
 function drupal_required_modules() {
-  return array('block', 'filter', 'node', 'system', 'user');
+  return array('block', 'filter', 'node', 'system', 'user', 'gd');
 }
Index: modules/system/system.install
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.install,v
retrieving revision 1.120
diff -u -p -r1.120 system.install
--- modules/system/system.install	5 Jun 2007 12:13:22 -0000	1.120
+++ modules/system/system.install	6 Jun 2007 09:21:47 -0000
@@ -3350,6 +3350,20 @@ function system_update_6023() {
 }
 
 /**
+ * Image toolkits are now modules, and the gd.module is always enabled default
+ */
+function system_update_6024() {
+  $ret = array();
+  // Set the default image toolkit to GD
+  variable_set('image_toolkit', 'gd');
+
+  // Enable the gd.module.
+  $ret[] = update_sql("UPDATE {system} SET status = 1 WHERE name = 'gd' AND type = 'module'");
+  return $ret;
+}
+
+ 
+/**
  * @} End of "defgroup updates-5.x-to-6.x"
  * The next series of updates should start at 7000.
  */
Index: modules/system/system.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.module,v
retrieving revision 1.489
diff -u -p -r1.489 system.module
--- modules/system/system.module	5 Jun 2007 09:15:02 -0000	1.489
+++ modules/system/system.module	6 Jun 2007 09:21:48 -0000
@@ -781,19 +781,31 @@ function system_file_system_settings() {
 }
 
 function system_image_toolkit_settings() {
-  $toolkits_available = image_get_available_toolkits();
-  if (count($toolkits_available) > 1) {
-    $form['image_toolkit'] = array(
+  $available_toolkits = image_get_toolkits();
+  $toolkit = image_get_toolkit();
+
+  if (count($available_toolkits) > 1) {
+     $form['image_toolkits'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Image processing toolkits'),
+      '#description' => t('For resizing, cropping and other image manipulations Drupal uses the %toolkit toolkit.', array('%toolkit' => $toolkit)),
+    );
+    $form['image_toolkits']['image_toolkit'] = array(
       '#type' => 'radios',
       '#title' => t('Select an image processing toolkit'),
-      '#default_value' => variable_get('image_toolkit', image_get_toolkit()),
-      '#options' => $toolkits_available
+      '#options' => image_get_toolkits(),
+      '#default_value' => $toolkit,
     );
   }
-  else {
-    $form['image_toolkit'] = array('#value' => '<p>'. t("No image toolkits found. Drupal will use PHP's built-in GD library for image handling.") .'</p>');
+
+  if ($settings = image_toolkit_invoke('settings')) {
+    $form['image_toolkit_'. $toolkit] = array(
+      '#type' => 'fieldset',
+      '#title' => t('!toolkit preferences', array('!toolkit' => drupal_ucfirst($toolkit))),
+    );
+    $form['image_toolkit_'. $toolkit]['image_toolkit_'. $toolkit .'_settings'] = $settings;
   }
-  $form['image_toolkit_settings'] = image_toolkit_invoke('settings');
+  
   return system_settings_form($form);
 }
 
