php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #37636 GdkPixbuf::new_from_gd transfers red colors only
Submitted: 2006-05-30 04:33 UTC Modified: 2006-09-09 20:49 UTC
From: cweiske@php.net Assigned:
Status: Closed Package: PHP-GTK related
PHP Version: 5.1.4 OS: Linux
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: cweiske@php.net
New email:
PHP Version: OS:

 

 [2006-05-30 04:33 UTC] cweiske@php.net
Description:
------------
GdkPixbuf::new_from_gd() seems to transfer the red parts of the picture to the pixbuf. Even when there is a black line, it appears light grey on the pixbuf.

Reproduce code:
---------------
<?php
//image_graph multiple plots usage example
error_reporting(E_ALL);
include 'Image/Graph.php';
// create the graph
$Graph =& Image_Graph::factory('graph', array(600, 400));
// add a TrueType font
$Font =& $Graph->addNew('font', 'Verdana');
// set the font size to 11 pixels
$Font->setSize(8);

$Graph->setFont($Font);

// create the plotarea
$Graph->add(
    Image_Graph::vertical(
        Image_Graph::vertical(
            $Title = Image_Graph::factory('title', array('Multiple Plots', 11)),
            $SubTitle = Image_Graph::factory('title', array('This is a demonstration of title alignment', 7)),
            90
        ),
        $Plotarea = Image_Graph::factory('plotarea'),
        8
    )
);	
$Title->setAlignment(IMAGE_GRAPH_ALIGN_LEFT);
$SubTitle->setAlignment(IMAGE_GRAPH_ALIGN_LEFT);
   
$Grid =& $Plotarea->addNew('bar_grid', IMAGE_GRAPH_AXIS_Y);
$Grid->setFillStyle(Image_Graph::factory('gradient', array(IMAGE_GRAPH_GRAD_VERTICAL, 'white', 'lightgrey')));    
	
$Plot =& $Plotarea->addNew('Image_Graph_Plot_Smoothed_Area', Image_Graph::factory('random', array(10, 20, 100, true)));
$Plot->setFillColor('red@0.2');

$Plot =& $Plotarea->addNew('line', Image_Graph::factory('random', array(10, 20, 100, true)));
$Plot->setLineColor('blue@0.2');
$CircleMarker =& Image_Graph::factory('Image_Graph_Marker_Circle');
$Plot->setMarker($CircleMarker);
$CircleMarker->setFillColor('white@0.4');
    
$Plot =& $Plotarea->addNew('bar', Image_Graph::factory('random', array(10, 2, 40, true)));
$Plot->setFillColor('green@0.2');
$Marker =& Image_Graph::factory('Image_Graph_Marker_Value', IMAGE_GRAPH_VALUE_Y);
$Plot->setMarker($Marker);
$Marker->setFillColor('white');
$Marker->setBorderColor('black');
    
$AxisY = $Plotarea->getAxis(IMAGE_GRAPH_AXIS_Y);
$AxisY->showArrow();

$Array = array(
    "Jan-Feb\n2004", 
    "Mar-Apr\n2004", 
    "May-Jun\n2004", 
    "Jul-Aug\n2004", 
    "Sep-Oct\n2004", 
    "Nov-Dev\n2004", 
    "Jan-Feb\n2005", 
    "Mar-Apr\n2005", 
    "May-Jun\n2005", 
    "Jul-Aug\n2005" 
);
$AxisX = $Plotarea->getAxis(IMAGE_GRAPH_AXIS_X);
$AxisX->setDataPreprocessor(Image_Graph::factory('Image_Graph_DataPreprocessor_Array', array($Array)));



//that is a critical line. Setting the output to "none" is important
$Graph->done(array('output' => 'none'));
$canvas = $Graph->_getCanvas();
$gd = $canvas->_canvas;
$pixbuf = GdkPixbuf::new_from_gd($gd);

$wnd = new GtkWindow();
$wnd->connect_simple('destroy', array('Gtk', 'main_quit'));
$wnd->add(GtkImage::new_from_pixbuf($pixbuf));
$wnd->show_all();
Gtk::main();
?>

Expected result:
----------------
http://xml.cweiske.de/2006-05-30%20multiple_slots_original.png

Actual result:
--------------
http://xml.cweiske.de/2006-05-30%20multiple_slots_gtk.png

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2006-06-03 18:55 UTC] andrei@php.net
Can you provide a shorter example without using Image_Graph? My tests show that everything transfers fine.

<?php

$w = new GtkWindow();
$w->connect_simple('destroy', array('gtk', 'main_quit'));

$values = array(
           40,  50,  // Point 1 (x, y)
           20,  240, // Point 2 (x, y)
           60,  60,  // Point 3 (x, y)
           240, 20,  // Point 4 (x, y)
           50,  40,  // Point 5 (x, y)
           10,  10  // Point 6 (x, y)
           );

// create image
$image = imagecreatetruecolor(250, 250);

// some colors
$bg  = imagecolorallocate($image, 200, 200, 200);
imagefill($image, 0, 0, $bg);
imagecolortransparent($image, $bg);
$blue = imagecolorallocate($image, 150, 90, 255);

// draw a polygon
imagefilledpolygon($image, $values, 6, $blue);

$pixbuf = GdkPixbuf::new_from_gd($image);

$b = new GtkButton();
$pixmap = GtkImage::new_from_pixbuf($pixbuf);
$b->add($pixmap);
$w->add($b);
$w->show_all();

gtk::main();

 [2006-06-09 18:26 UTC] cweiske@php.net
Even your example shows the wrong colors.
See: http://xml.cweiske.de/2006-06-09%20new_from_gd%20wrong%20colors.png

Try to set the colors to:
$bg  = imagecolorallocate($image, 0, 255, 0);
$blue = imagecolorallocate($image, 0, 0, 255);

which have no red in them. The image will be totally transparent
 [2006-06-09 20:28 UTC] cweiske@php.net
Since it works on Andrei's laptop (a Macbook with G4 processor), but not on my pc nor on scott's pc, I assume it's an endian problem. The bits are in the wrong order for PCs.
 [2006-09-09 20:23 UTC] andrei@php.net
I committed what I think is the correct fix to gdk.overrides. Please test and report back.
 [2006-09-09 20:49 UTC] cweiske@php.net
works fine.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sat Dec 21 18:01:29 2024 UTC