Revision: 4374
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=4374&view=rev
Author:   efiring
Date:     2007-11-18 10:59:56 -0800 (Sun, 18 Nov 2007)

Log Message:
-----------
Let to_rgba return uint8; track changes to cmap

Images require rgba as 4 uint8s, so it is more efficient
to generate these directly in to_rgba than to generate 4
doubles and convert them later.

The tracking of changes in ScalarMappable was handling
communication between objects, but was not keeping track of
when to_rgba needs to be rerun.  A dictionary was added
to do this.

Modified Paths:
--------------
    trunk/matplotlib/lib/matplotlib/cm.py

Modified: trunk/matplotlib/lib/matplotlib/cm.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/cm.py       2007-11-18 16:45:28 UTC (rev 
4373)
+++ trunk/matplotlib/lib/matplotlib/cm.py       2007-11-18 18:59:56 UTC (rev 
4374)
@@ -40,6 +40,7 @@
         self.cmap = cmap
         self.observers = []
         self.colorbar = None
+        self.update_dict = {'array':False}
 
     def set_colorbar(self, im, ax):
         'set the colorbar image and axes associated with mappable'
@@ -47,11 +48,26 @@
 
     def to_rgba(self, x, alpha=1.0, bytes=False):
         '''Return a normalized rgba array corresponding to x.
-        If x is already an rgb or rgba array, return it unchanged.
+        If x is already an rgb array, insert alpha; if it is
+        already rgba, return it unchanged.
+        If bytes is True, return rgba as 4 uint8s instead of 4 floats.
         '''
         try:
-            if x.ndim == 3 and (x.shape[2] == 3 or x.shape[2] == 4):
-                return x
+            if x.ndim == 3:
+                if x.shape[2] == 3:
+                    if x.dtype == npy.uint8:
+                        alpha = npy.array(alpha*255, npy.uint8)
+                    m, n = npy.shape[:2]
+                    xx = npy.empty(shape=(m,n,4), dtype = x.dtype)
+                    xx[:,:,:3] = x
+                    xx[:,:,3] = alpha
+                elif x.shape[2] == 4:
+                    xx = x
+                else:
+                    raise ValueError("third dimension must be 3 or 4")
+                if bytes and xx.dtype != npy.uint8:
+                    xx = (xx * 255).astype(npy.uint8)
+                return xx
         except AttributeError:
             pass
         x = ma.asarray(x)
@@ -62,6 +78,7 @@
     def set_array(self, A):
         'Set the image array from numpy array A'
         self._A = A
+        self.update_dict['array'] = True
 
     def get_array(self):
         'Return the array'
@@ -124,7 +141,23 @@
         self.changed()
 
 
+    def add_checker(self, checker):
+        """
+        Add an entry to a dictionary of boolean flags
+        that are set to True when the mappable is changed.
+        """
+        self.update_dict[checker] = False
 
+    def check_update(self, checker):
+        """
+        If mappable has changed since the last check,
+        return True; else return False
+        """
+        if self.update_dict[checker]:
+            self.update_dict[checker] = False
+            return True
+        return False
+
     def add_observer(self, mappable):
         """
         whenever the norm, clim or cmap is set, call the notify
@@ -158,3 +191,6 @@
         """
         for observer in self.observers:
             observer.notify(self)
+        for key in self.update_dict:
+            self.update_dict[key] = True
+


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to