? .cache ? .project ? .projectOptions ? files ? test.patch ? includes/image.gd.inc ? misc/Thumbs.db ? misc/farbtastic/Thumbs.db ? modules/gd ? modules/imagemagick ? sites/all/modules ? sites/default/settings.php Index: includes/image.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/image.inc,v retrieving revision 1.21 diff -u -r1.21 image.inc --- includes/image.inc 12 May 2007 05:51:20 -0000 1.21 +++ includes/image.inc 12 Jul 2007 17:21:03 -0000 @@ -2,9 +2,15 @@ // $Id: image.inc,v 1.21 2007/05/12 05:51:20 dries Exp $ /** + * @file + * GD2 toolkit for image manipulation within Drupal. + */ + +/** * Return a list of available toolkits. * - * @return An array of toolkit name => descriptive title. + * @return + * An array of toolkit name => descriptive title. */ function image_get_available_toolkits() { $toolkits = file_scan_directory('includes', 'image\..*\.inc$'); @@ -18,21 +24,23 @@ $output[$info['name']] = $info['title']; } } - $output['gd'] = t('Built-in GD2 toolkit'); + return $output; } /** * Retrieve the name of the currently used toolkit. * - * @return String containing the name of the toolkit. + * @return + * String containing the name of the selected toolkit, or FALSE on error. */ 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)) { + if (isset($toolkit) && file_exists($toolkit_file)) { include_once $toolkit_file; } elseif (!image_gd_check_settings()) { @@ -46,10 +54,12 @@ /** * Invokes the given method using the currently selected toolkit. * - * @param $method A string containing the method to invoke. - * @param $params An optional array of parameters to pass to the toolkit method. - * - * @return Mixed values (typically Boolean for successful operation). + * @param $method + * A string containing the method to invoke. + * @param $params + * An optional array of parameters to pass to the toolkit method. + * @return + * Mixed values (typically Boolean indicating successful operation). */ function image_toolkit_invoke($method, $params = array()) { if ($toolkit = image_get_toolkit()) { @@ -62,23 +72,22 @@ return FALSE; } } - else { - if ($method == 'settings') { - return image_gd_settings(); - } - } } /** * Get details about an image. + * + * Drupal only supports GIF, JPG and PNG file formats. * - * @return array containing information about the image - * 'width': image's width in pixels - * 'height': image's height in pixels - * 'extension': commonly used extension for the image - * 'mime_type': image's MIME type ('image/jpeg', 'image/gif', etc.) - * 'file_size': image's physical size (in bytes) + * @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'). + * 'file_size' - File size in bytes. */ function image_get_info($file) { if (!is_file($file)) { @@ -110,12 +119,16 @@ * * The resulting image always has the exact target dimensions. * - * @param $source The file path of the source image - * @param $destination The file path of the destination image - * @param $width The target width - * @param $height The target height - * - * @return TRUE or FALSE, based on success + * @param $source + * The file path of the source image. + * @param $destination + * The file path of the destination image. + * @param $width + * The target width, in pixels. + * @param $height + * The target height, in pixels. + * @return + * TRUE or FALSE, based on success. */ function image_scale_and_crop($source, $destination, $width, $height) { $info = image_get_info($source); @@ -136,12 +149,16 @@ * * The resulting image can be smaller for one or both target dimensions. * - * @param $source The file path of the source image - * @param $destination The file path of the destination image - * @param $width The target width - * @param $height The target height - * - * @return True or FALSE, based on success + * @param $source + * The file path of the source image. + * @param $destination + * The file path of the destination image. + * @param $width + * The target width, in pixels. + * @param $height + * The target height, in pixels. + * @return + * TRUE or FALSE, based on success. */ function image_scale($source, $destination, $width, $height) { $info = image_get_info($source); @@ -167,10 +184,16 @@ /** * Resize an image to the given dimensions (ignoring aspect ratio). * - * @param $source The filepath of the source image. - * @param $destination The file path of the destination image. - * @param $width The target width. - * @param $height The target height. + * @param $source + * The file path of the source image. + * @param $destination + * The file path of the destination image. + * @param $width + * The target width, in pixels. + * @param $height + * The target height, in pixels. + * @return + * TRUE or FALSE, based on success. */ function image_resize($source, $destination, $width, $height) { return image_toolkit_invoke('resize', array($source, $destination, $width, $height)); @@ -179,180 +202,41 @@ /** * Rotate an image by the given number of degrees. * - * @param $source The filepath of the source image - * @param $destination The file path of the destination image - * @param $degrees The number of (clockwise) degrees to rotate the image + * @param $source + * The file path of the source image. + * @param $destination + * The file path of the destination image. + * @param $degrees + * The number of (clockwise) degrees to rotate the image. + * @param $bg_color + * An hexidecimal integer specifying the background color to use for the + * uncovered area of the image after the rotation. E.g. 0x000000 for black, + * 0xff00ff for magenta, and 0xffffff for white. + * @return + * TRUE or FALSE, based on success. */ -function image_rotate($source, $destination, $degrees) { - return image_toolkit_invoke('rotate', array($source, $destination, $degrees)); +function image_rotate($source, $destination, $degrees, $bg_color = 0x000000) { + return image_toolkit_invoke('rotate', array($source, $destination, $degrees, $bg_color)); } /** * Crop an image to the rectangle specified by the given rectangle. * - * @param $source The filepath of the source image - * @param $destination The file path of the destination image - * @param $x The top left co-ordinate of the crop area (x axis value) - * @param $y The top left co-ordinate of the crop area (y axis value) - * @param $width The target width - * @param $height The target height + * @param $source + * The file path of the source image. + * @param $destination + * The file path of the destination image. + * @param $x + * The top left co-ordinate, in pixels, of the crop area (x axis value). + * @param $y + * The top left co-ordinate, in pixels, of the crop area (y axis value). + * @param $width + * The target width, in pixels. + * @param $height + * The target height, in pixels. + * @return + * TRUE or FALSE, based on success. */ 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: modules/system/system.module =================================================================== RCS file: /cvs/drupal/drupal/modules/system/system.module,v retrieving revision 1.509 diff -u -r1.509 system.module --- modules/system/system.module 5 Jul 2007 08:48:58 -0000 1.509 +++ modules/system/system.module 12 Jul 2007 16:46:27 -0000 @@ -788,10 +788,12 @@ '#options' => $toolkits_available ); } - else { - $form['image_toolkit'] = array('#value' => '

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

'); + elseif (count($toolkits_available) == 1) { + variable_set('image_toolkit', key($toolkits_available)); } + $form['image_toolkit_settings'] = image_toolkit_invoke('settings'); + return system_settings_form($form); } --- includes/image.gd.inc +++ includes/image.gd.inc @@ -0,0 +1,185 @@ + 'gd', 'title' => t('GD2 image manipulation toolkit')); +} + +/** + * Retrieve settings for the GD2 toolkit. + */ +function image_gd_settings() { + if (image_gd_check_settings()) { + $form = array(); + $form['status'] = array( + '#value' => t('The GD 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 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 + * A boolean indicating if the GD toolkit is avaiable on this machine. + */ +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 = 0x000000) { + 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. + * + * @param $file + * A string file path where the iamge should be saved. + * @param $extension + * A string containing one of the following extensions: gif, jpg, jpeg, png. + * @return + * An image resource, or FALSE on error. + */ +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. + * + * @param $res + * An image resource created with image_gd_open(). + * @param $destination + * A string file path where the iamge should be saved. + * @param $extension + * A string containing one of the following extensions: gif, jpg, jpeg, png. + * @return + * Boolean indicating success. + */ +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); + } +}