/[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 2514 by frank, Mon Jan 3 16:21:17 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, \
26      wxTRANSPARENT_PEN, wxTRANSPARENT_BRUSH, \      wxTRANSPARENT_PEN, wxTRANSPARENT_BRUSH, \
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_GIF      wxBITMAP_TYPE_JPEG, wxBITMAP_TYPE_PNG, wxBITMAP_TYPE_TIF, \
30        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 38  import Thuban.Model.resource Line 43  import Thuban.Model.resource
43    
44  from baserenderer import BaseRenderer  from baserenderer import BaseRenderer
45    
46    from math import floor
47    
48    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 87  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 99  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, data, format = 'BMP'):      def projected_raster_layer(self, layer, srcProj, dstProj, extents,
119          stream = cStringIO.StringIO(data)                                 resolution, dimensions, options):
120          image = wxImageFromStream(stream, raster_format_map[format])          """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
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':
159                image = wxEmptyImage(width, height)
160                image.SetData(image_data)
161                if mask_data is not None:
162                    mask = wxBitmapFromBits(mask_data, width, height, 1)
163                    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:
169                stream = cStringIO.StringIO(image_data)
170                image = wxImageFromStream(stream, raster_format_map[format])
171                if mask_data is not None:
172                    stream = cStringIO.StringIO(mask_data)
173                    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          self.dc.DrawBitmap(bitmap, 0, 0)  
199            if mask is not None:
200                bitmap.SetMask(mask)
201    
202            self.dc.DrawBitmap(bitmap, int(round(x)), int(round(y)), True)
203    
204    
205  class ScreenRenderer(MapRenderer):  class ScreenRenderer(MapRenderer):

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26