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 PHP\'s image documentation.', 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' => '

'. t("No image toolkits found. Drupal will use PHP's built-in GD library for image handling.") .'

'); + + 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); }