/[thuban]/branches/WIP-pyshapelib-bramz/Thuban/UI/renderer.py
ViewVC logotype

Diff of /branches/WIP-pyshapelib-bramz/Thuban/UI/renderer.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2551 by jonathan, Thu Jan 27 14:19:41 2005 UTC revision 2602 by joey, Mon Apr 25 15:01:48 2005 UTC
# Line 16  __version__ = "$Revision$" Line 16  __version__ = "$Revision$"
16    
17  import cStringIO  import cStringIO
18    
19    import array
20    
21    import traceback
22    
23  from Thuban import _  from Thuban import _
24    
25  from wxPython.wx import wxPoint, wxRect, wxPen, wxBrush, wxFont, \  from wxPython.wx import wxPoint, wxRect, wxPen, wxBrush, wxFont, \
# Line 23  from wxPython.wx import wxPoint, wxRect, Line 27  from wxPython.wx import wxPoint, wxRect,
27      wxBLACK_PEN, wxBLACK, wxSOLID, wxCROSS_HATCH, wxSWISS, wxNORMAL, \      wxBLACK_PEN, wxBLACK, wxSOLID, wxCROSS_HATCH, wxSWISS, wxNORMAL, \
28      wxBitmapFromImage, wxImageFromStream, wxBITMAP_TYPE_BMP, \      wxBitmapFromImage, wxImageFromStream, wxBITMAP_TYPE_BMP, \
29      wxBITMAP_TYPE_JPEG, wxBITMAP_TYPE_PNG, wxBITMAP_TYPE_TIF, \      wxBITMAP_TYPE_JPEG, wxBITMAP_TYPE_PNG, wxBITMAP_TYPE_TIF, \
30      wxBITMAP_TYPE_GIF, wxEmptyImage, wxMask      wxBITMAP_TYPE_GIF, wxEmptyImage, wxMask, wxBitmapFromBits
31    
32  from wxproj import draw_polygon_shape, draw_polygon_init  from wxproj import draw_polygon_shape, draw_polygon_init
33    
# Line 43  from math import floor Line 47  from math import floor
47    
48  from types import StringType  from types import StringType
49    
50    from Thuban.version import versions
51    
52    if Thuban.Model.resource.has_gdal_support():
53        from gdalwarp import ProjectRasterFile
54    
55    
56  # Map the strings used for the format parameter of the draw_raster_data  # Map the strings used for the format parameter of the draw_raster_data
57  # method to the appropriate wxWindows constants  # method to the appropriate wxWindows constants
# Line 92  class MapRenderer(BaseRenderer): Line 101  class MapRenderer(BaseRenderer):
101          if (layer.ShapeStore().RawShapeFormat() == RAW_SHAPEFILE          if (layer.ShapeStore().RawShapeFormat() == RAW_SHAPEFILE
102              and layer.ShapeType() in (SHAPETYPE_ARC, SHAPETYPE_POLYGON)):              and layer.ShapeType() in (SHAPETYPE_ARC, SHAPETYPE_POLYGON)):
103              offx, offy = self.offset              offx, offy = self.offset
104                x = lambda a, b, c, d: None
105                #return (True, x, None)
106              return (True, draw_polygon_shape,              return (True, draw_polygon_shape,
107                      draw_polygon_init(layer.ShapeStore().Shapefile(),                      draw_polygon_init(layer.ShapeStore().Shapefile(),
108                                        self.dc, self.map.projection,                                        self.dc, self.map.projection,
# Line 104  class MapRenderer(BaseRenderer): Line 115  class MapRenderer(BaseRenderer):
115          return wxFont(int(round(self.resolution * 10)), wxSWISS, wxNORMAL,          return wxFont(int(round(self.resolution * 10)), wxSWISS, wxNORMAL,
116                        wxNORMAL)                        wxNORMAL)
117    
118      def draw_raster_data(self, x,y, data, format = 'BMP'):      def projected_raster_layer(self, layer, srcProj, dstProj, extents,
119                                   resolution, dimensions, options):
120            """Returns a raster layer image in projected space
121    
122            Based on a given filename.  This method must be implemented in
123            classes derived from BaseRenderer.
124            """
125    
126            ret = None
127    
128            if Thuban.Model.resource.has_gdal_support():
129    
130                if versions['wxPython-tuple'] < (2,5,3):
131                    options = options | 4  # INVERT_MASK_BITS
132                    options = options & ~2 # ALPHA_MASK not supported
133    
134                try:
135                    ret = ProjectRasterFile(layer.GetImageFilename(),
136                                            srcProj, dstProj,
137                                            extents, resolution, dimensions,
138                                            options)
139                except (MemoryError, IOError, AttributeError, ValueError):
140                    # Why does this catch AttributeError and ValueError?
141                    # FIXME: The exception should be communicated to the user
142                    # better.
143                    traceback.print_exc()
144    
145            return ret
146    
147        def draw_raster_data(self, layer, x,y, data, format = 'BMP'):
148    
149          mask = None          mask = None
150            alpha = None
151            width = data[0]
152            height = data[1]
153            image_data, mask_data, alpha_data = data[2]
154    
155            if versions['wxPython-tuple'] < (2,5,3):
156                alpha_data = None
157    
158          if format == 'RAW':          if format == 'RAW':
159              image = wxEmptyImage(data[0], data[1])              image = wxEmptyImage(width, height)
160              image.SetData(data[2][0])              image.SetData(image_data)
161              if data[2][1] is not None:              if mask_data is not None:
162                  mask = wxEmptyImage(data[0], data[1])                  mask = wxBitmapFromBits(mask_data, width, height, 1)
163                  mask.SetData(data[2][1])                  mask = wxMask(mask)
164                elif alpha_data is not None:
165                    # alpha_data is already in the right format
166                    alpha = alpha_data
167    
168          else:          else:
169              stream = cStringIO.StringIO(data[2][0])              stream = cStringIO.StringIO(image_data)
170              image = wxImageFromStream(stream, raster_format_map[format])              image = wxImageFromStream(stream, raster_format_map[format])
171              if data[2][1] is not None:              if mask_data is not None:
172                  stream = cStringIO.StringIO(data[2][1])                  stream = cStringIO.StringIO(mask_data)
173                  mask = wxImageFromStream(stream, raster_format_map[format])                  mask = wxImageFromStream(stream, raster_format_map[format])
174                    mask = wxMask(wxBitmapFromImage(mask, 1))
175                elif alpha_data is not None:
176                    stream = cStringIO.StringIO(alpha_data)
177                    alpha = wxImageFromStream(stream, raster_format_map[format])
178                    alpha = alpha.GetData()[:] # XXX: do we need to copy this?
179    
180            #
181            # if we are using the alpha_data then scale down the alpha values
182            # by the layer's opacity using a string translation table
183            #
184            if alpha is not None:
185                lo = layer.Opacity()
186                if lo == 0:
187                    return
188                elif lo == 1:
189                    a = alpha
190                else:
191                    tr = [int(i*lo) for i in range(256)]
192                    table = array.array('B', tr).tostring()
193                    a = alpha.translate(table)
194    
195                image.SetAlphaData(a)
196    
197          bitmap = wxBitmapFromImage(image)          bitmap = wxBitmapFromImage(image)
198    
199          if mask is None:          if mask is not None:
200              self.dc.DrawBitmap(bitmap, int(round(x)), int(round(y)), False)              bitmap.SetMask(mask)
201          else:  
202              # if we are given a mask object, try to pass it to SetMaskColour,          self.dc.DrawBitmap(bitmap, int(round(x)), int(round(y)), True)
             # otherwise assume it's a mask image  
             try:  
                 bitmap.SetMask(wxMask(wxBitmapFromImage(mask, 1)))  
                 self.dc.DrawBitmap(bitmap, int(round(x)), int(round(y)), True)  
             except (TypeError):  
                 # implement using a mask image  
                 raise NotImplementedError  
203    
204    
205  class ScreenRenderer(MapRenderer):  class ScreenRenderer(MapRenderer):

Legend:
Removed from v.2551  
changed lines
  Added in v.2602

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26