Rene,
You are right. I isolated the specific issue, and here's a sample .c file
that shows the error on the 64 bit platform. When I get something that works
on the the test file, I'll try it on the actual pygame code and see how the
test performs.
-Tyler
On Fri, May 1, 2009 at 4:30 PM, Tyler Laing <[email protected]> wrote:
> I'll try that then. For reference, I am using an AMD Athlon 64 X2 5200+
> processor. What would be the proper way to make it endian safe?
>
> Change the unsigned long tmp to unsigned int tmp?
>
> -Tyler
>
>
> On Fri, May 1, 2009 at 4:24 PM, René Dudfield <[email protected]> wrote:
>
>> hi,
>>
>> there's some parts like this...
>>
>> static PyObject*
>> _color_float (PyColor *color)
>> {
>> unsigned long tmp = (color->r << 24) + (color->g << 16) + (color->b <<
>> 8) +
>> color->a;
>> return PyFloat_FromDouble ((double) tmp);
>> }
>>
>> this code isn't endian or 64bit safe... since it is using bit shifting
>> for packing. On different platforms, this produces different outputs.
>>
>> I think it has to convert into the same 32bit unsigned int, and then
>> return that.
>>
>>
>>
>>
>> On Sat, May 2, 2009 at 8:54 AM, Tyler Laing <[email protected]> wrote:
>> > Taking a look at color.c, I believe the bug may actually rest in the
>> > Py<type>_FromUnsignedLong/Py<type>_FromDouble/Py<type>_FromString
>> functions
>> > provided by the Python libs. There is no logical or numerical reason
>> why,
>> > from the numbers we have, we would get those values with those
>> operations.
>> > The tests beforehand affirm that the r, g, b, and a variables all the
>> proper
>> > values, it just happens to be the one step in the code. I'll examine
>> > further.
>> >
>> > -Tyler
>> >
>> > On Fri, May 1, 2009 at 3:28 PM, René Dudfield <[email protected]> wrote:
>> >>
>> >> hi,
>> >>
>> >> Below are the failing unittests for Color on 64bit ubuntu.
>> >>
>> >>
>> >>
>> >>
>> >> ======================================================================
>> >> > FAIL: ColorTypeTest.test_float
>> >> >
>> ----------------------------------------------------------------------
>> >> > Traceback (most recent call last):
>> >> > File "/usr/lib/python2.5/site-packages/pygame/tests/color_test.py",
>> >> > line
>> >> > 412, in test_float
>> >> > self.assertEquals (float (c), float (0xCC00CC00))
>> >> > AssertionError: 1.844674407283719e+19 != 3422604288.0
>> >> >
>> >> >
>> ======================================================================
>> >> > FAIL: ColorTypeTest.test_hex
>> >> >
>> ----------------------------------------------------------------------
>> >> > Traceback (most recent call last):
>> >> > File "/usr/lib/python2.5/site-packages/pygame/tests/color_test.py",
>> >> > line
>> >> > 442, in test_hex
>> >> > self.assertEquals (hex (c), hex (0xCC00CC00))
>> >> > AssertionError: '0xffffffffcc00cc00L' != '0xcc00cc00'
>> >> >
>> >> >
>> ======================================================================
>> >> > FAIL: ColorTypeTest.test_int
>> >> >
>> ----------------------------------------------------------------------
>> >> > Traceback (most recent call last):
>> >> > File "/usr/lib/python2.5/site-packages/pygame/tests/color_test.py",
>> >> > line
>> >> > 494, in test_int
>> >> > self.assertEquals (int (c), int (0xCC00CC00))
>> >> > AssertionError: 18446744072837188608L != 3422604288
>> >> >
>> >> >
>> ======================================================================
>> >> > FAIL: ColorTypeTest.test_long
>> >> >
>> ----------------------------------------------------------------------
>> >> > Traceback (most recent call last):
>> >> > File "/usr/lib/python2.5/site-packages/pygame/tests/color_test.py",
>> >> > line
>> >> > 511, in test_long
>> >> > self.assertEquals (long (c), long (0xCC00CC00))
>> >> > AssertionError: 18446744072837188608L != 3422604288L
>> >> >
>> >> >
>> ======================================================================
>> >> > FAIL: ColorTypeTest.test_oct
>> >> >
>> ----------------------------------------------------------------------
>> >> > Traceback (most recent call last):
>> >> > File "/usr/lib/python2.5/site-packages/pygame/tests/color_test.py",
>> >> > line
>> >> > 427, in test_oct
>> >> > self.assertEquals (oct (c), oct (0xCC00CC00))
>> >> > AssertionError: '01777777777771400146000L' != '031400146000'
>> >> >
>> >> >
>> ======================================================================
>> >> > FAIL: ColorTypeTest.test_webstyle
>> >> >
>> ----------------------------------------------------------------------
>> >> > Traceback (most recent call last):
>> >> > File "/usr/lib/python2.5/site-packages/pygame/tests/color_test.py",
>> >> > line
>> >> > 458, in test_webstyle
>> >> > self.assertEquals (hex (c), hex (0xCC00CC11))
>> >> > AssertionError: '0xffffffffcc00cc11L' != '0xcc00cc11'
>> >> >
>> >> >
>> >
>> >
>> >
>> > --
>> > Visit my blog at http://oddco.ca/zeroth/zblog
>> >
>>
>
>
>
> --
> Visit my blog at http://oddco.ca/zeroth/zblog
>
--
Visit my blog at http://oddco.ca/zeroth/zblog
//test_color.c
#include <stdio.h>
#include <ctype.h>
#include <stdint.h>
typedef uint8_t Uint8;
main()
{
Uint8 r=204;
Uint8 g=0;
Uint8 b=204;
Uint8 a=0;
unsigned long tmp = (r << 24) + (g << 16) + (b << 8) + a;
printf("%lu\n", tmp);
}