summaryrefslogtreecommitdiff
path: root/modules/system
diff options
context:
space:
mode:
authorDavid Rothstein <drothstein@gmail.com>2015-03-30 01:18:18 -0400
committerDavid Rothstein <drothstein@gmail.com>2015-03-30 01:18:18 -0400
commit5a1ad44daed5ac2d53eb4332a683549b55579570 (patch)
tree4ef64a5becc279ff77651bb8ce218f604fd1de22 /modules/system
parentbe97f50fba4c7c87b4332d30cf8e0f612b89bdb5 (diff)
downloadbrdo-5a1ad44daed5ac2d53eb4332a683549b55579570.tar.gz
brdo-5a1ad44daed5ac2d53eb4332a683549b55579570.tar.bz2
Issue #375062 by cs_shadow, David_Rothstein, mondrake, juampy, theunraveler, hswong3i, smk-ka, fietserwin: "imagecolorsforindex() Color index nnn out of range in GDToolkit" message sometimes appears
Diffstat (limited to 'modules/system')
-rw-r--r--modules/system/image.gd.inc49
1 files changed, 40 insertions, 9 deletions
diff --git a/modules/system/image.gd.inc b/modules/system/image.gd.inc
index d9035e4c6..913b0de51 100644
--- a/modules/system/image.gd.inc
+++ b/modules/system/image.gd.inc
@@ -229,7 +229,24 @@ function image_gd_desaturate(stdClass $image) {
function image_gd_load(stdClass $image) {
$extension = str_replace('jpg', 'jpeg', $image->info['extension']);
$function = 'imagecreatefrom' . $extension;
- return (function_exists($function) && $image->resource = $function($image->source));
+ if (function_exists($function) && $image->resource = $function($image->source)) {
+ if (imageistruecolor($image->resource)) {
+ return TRUE;
+ }
+ else {
+ // Convert indexed images to truecolor, copying the image to a new
+ // truecolor resource, so that filters work correctly and don't result
+ // in unnecessary dither.
+ $resource = image_gd_create_tmp($image, $image->info['width'], $image->info['height']);
+ if ($resource) {
+ imagecopy($resource, $image->resource, 0, 0, 0, 0, imagesx($resource), imagesy($resource));
+ imagedestroy($image->resource);
+ $image->resource = $resource;
+ }
+ }
+ return (bool) $image->resource;
+ }
+ return FALSE;
}
/**
@@ -297,17 +314,31 @@ function image_gd_create_tmp(stdClass $image, $width, $height) {
$res = imagecreatetruecolor($width, $height);
if ($image->info['extension'] == 'gif') {
- // Grab transparent color index from image resource.
+ // Find out if a transparent color is set, will return -1 if no
+ // transparent color has been defined in the image.
$transparent = imagecolortransparent($image->resource);
if ($transparent >= 0) {
- // The original must have a transparent color, allocate to the new image.
- $transparent_color = imagecolorsforindex($image->resource, $transparent);
- $transparent = imagecolorallocate($res, $transparent_color['red'], $transparent_color['green'], $transparent_color['blue']);
-
- // Flood with our new transparent color.
- imagefill($res, 0, 0, $transparent);
- imagecolortransparent($res, $transparent);
+ // Find out the number of colors in the image palette. It will be 0 for
+ // truecolor images.
+ $palette_size = imagecolorstotal($image->resource);
+ if ($palette_size == 0 || $transparent < $palette_size) {
+ // Set the transparent color in the new resource, either if it is a
+ // truecolor image or if the transparent color is part of the palette.
+ // Since the index of the transparency color is a property of the
+ // image rather than of the palette, it is possible that an image
+ // could be created with this index set outside the palette size (see
+ // http://stackoverflow.com/a/3898007).
+ $transparent_color = imagecolorsforindex($image->resource, $transparent);
+ $transparent = imagecolorallocate($res, $transparent_color['red'], $transparent_color['green'], $transparent_color['blue']);
+
+ // Flood with our new transparent color.
+ imagefill($res, 0, 0, $transparent);
+ imagecolortransparent($res, $transparent);
+ }
+ else {
+ imagefill($res, 0, 0, imagecolorallocate($res, 255, 255, 255));
+ }
}
}
elseif ($image->info['extension'] == 'png') {