[Skencil-commits] r520 - in skencil/trunk/Plugins: . Filters/Lib

scm-commit@wald.intevation.org scm-commit at wald.intevation.org
Sun Feb 12 00:19:55 CET 2006


Author: bh
Date: 2006-02-12 00:19:55 +0100 (Sun, 12 Feb 2006)
New Revision: 520

Modified:
   skencil/trunk/Plugins/ChangeLog
   skencil/trunk/Plugins/Filters/Lib/drawfile.py
   skencil/trunk/Plugins/Filters/Lib/spritefile.py
Log:
Same change as previously commited to the skencil-0.6 branch:

Fix some problems in the drawfile filter because of changes in the
int/long unification introduced in Python 2.4

* Filters/Lib/spritefile.py (spritefile.str2num): Implement in
terms of the module global str2num:
(str2num): New function that was formerly a method with the same
used in spritefile and drawfile.  The implementation is completely
new because the old implementation was incorrect in Python 2.4
because the behavior of the << operator has change a bit.

* Filters/Lib/drawfile.py (drawfile_object.str2num)
(drawfile.str2num): Implement in terms of spritefile.str2num.
(drawfile.new): Convert some hexadecimal constants to decimal so
that they still have the same value in python 2.4 as before.


Modified: skencil/trunk/Plugins/ChangeLog
===================================================================
--- skencil/trunk/Plugins/ChangeLog	2006-02-11 23:08:36 UTC (rev 519)
+++ skencil/trunk/Plugins/ChangeLog	2006-02-11 23:19:55 UTC (rev 520)
@@ -1,3 +1,20 @@
+2006-02-12  Bernhard Herzog  <bh at intevation.de>
+
+	Fix some problems in the drawfile filter because of changes in the
+	int/long unification introduced in Python 2.4
+
+	* Filters/Lib/spritefile.py (spritefile.str2num): Implement in
+	terms of the module global str2num:
+	(str2num): New function that was formerly a method with the same
+	used in spritefile and drawfile.  The implementation is completely
+	new because the old implementation was incorrect in Python 2.4
+	because the behavior of the << operator has change a bit.
+
+	* Filters/Lib/drawfile.py (drawfile_object.str2num)
+	(drawfile.str2num): Implement in terms of spritefile.str2num.
+	(drawfile.new): Convert some hexadecimal constants to decimal so
+	that they still have the same value in python 2.4 as before.
+
 2005-07-30  Bernhard Herzog  <bh at intevation.de>
 
 	* Filters/sk1loader.py (make_base_style): New function that

Modified: skencil/trunk/Plugins/Filters/Lib/drawfile.py
===================================================================
--- skencil/trunk/Plugins/Filters/Lib/drawfile.py	2006-02-11 23:08:36 UTC (rev 519)
+++ skencil/trunk/Plugins/Filters/Lib/drawfile.py	2006-02-11 23:19:55 UTC (rev 520)
@@ -33,6 +33,7 @@
 # Tidied up some formatting errors caused by mixing tabs and spaces.
 
 import spritefile, os, string
+import struct
 
 version = '0.13 (Sat 20th October 2001)'
 
@@ -81,15 +82,7 @@
         return s
 
     def str2num(self, size, s):
-    
-        i = 0
-        n = 0
-        while i < size:
-    
-            n = n | (ord(s[i]) << (i*8))
-            i = i + 1
-    
-        return n
+        return spritefile.str2num(size, s)
 
     def decode_double(self, s):
         """Return a floating point number from an IEEE double encoded in a
@@ -1292,9 +1285,18 @@
 
         self.x1 = 0x7fffffff
         self.y1 = 0x7fffffff
-        self.x2 = 0x80000000
-        self.y2 = 0x80000000
 
+        # Note: self.x2 and self.y2 used to be initialized to
+        # 0x80000000.  In Python 2.4 the meaning of that literal has
+        # changed to be always positive instead of being negative on 32
+        # bit platforms.  To avoid problems with that the constants have
+        # been replaced with the decimal version of the interpretation
+        # of 0x80000000 on 32 bit machines.  It's not clear whether that
+        # really is the right solution.  The intention of the value
+        # might have been something like -sys.maxint - 1 instead.
+        self.x2 = -2147483648
+        self.y2 = -2147483648
+
     def number(self, size, n):
     
         # Little endian writing
@@ -1312,17 +1314,9 @@
 
 
     def str2num(self, size, s):
-    
-        i = 0
-        n = 0
-        while i < size:
-    
-            n = n | (ord(s[i]) << (i*8))
-            i = i + 1
-    
-        return n
-    
-    
+        return spritefile.str2num(size, s)
+
+
     def read_group(self, f):
 
         start = f.tell() - 4

Modified: skencil/trunk/Plugins/Filters/Lib/spritefile.py
===================================================================
--- skencil/trunk/Plugins/Filters/Lib/spritefile.py	2006-02-11 23:08:36 UTC (rev 519)
+++ skencil/trunk/Plugins/Filters/Lib/spritefile.py	2006-02-11 23:19:55 UTC (rev 520)
@@ -26,6 +26,22 @@
 
 version = '0.12 (Sun 17th February 2002)'
 
+import struct
+
+def str2num(size, s):
+    """Convert the integer in the string s which has to contain size bytes.
+
+    Allowed sizes are 1, 2 and 4.  1-byte and 2-byte integers as
+    unsigned and 4-byte integers as signed.  All numbers were
+    little-endian.
+    """
+    formats = ("<B", "<H", None, "<i")
+    format = formats[size - 1]
+    if format is None:
+        raise ValueError("Size must be one of 1, 2, or 4")
+    return struct.unpack(format, s)[0]
+
+
 class spritefile_error(Exception):
 
     pass
@@ -119,15 +135,7 @@
 
 
     def str2num(self, size, s):
-    
-        i = 0
-        n = 0
-        while i < size:
-    
-            n = n | (ord(s[i]) << (i*8))
-            i = i + 1
-    
-        return n
+        return str2num(size, s)
 
     def sprite2rgb(self, file, width, height, h_words, first_bit_used, bpp,
                    palette):



More information about the Skencil-commits mailing list