Jelajahi Sumber

wxGUI/animation: fix rendering when zooming in animation tool

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@59561 15284696-431f-4ddb-bdfa-cd5b030d7da7
Anna Petrášová 11 tahun lalu
induk
melakukan
3f4d5f61d6
2 mengubah file dengan 16 tambahan dan 6 penghapusan
  1. 6 3
      gui/wxpython/animation/controller.py
  2. 10 3
      gui/wxpython/animation/data.py

+ 6 - 3
gui/wxpython/animation/controller.py

@@ -327,7 +327,8 @@ class AnimationController(wx.EvtHandler):
                     self.animations[i].SetActive(False)
                     continue
                 anim = [anim for anim in self.animationData if anim.windowIndex == i][0]
-                regions = anim.GetRegions()
+                w, h = self.mapwindows[i].GetClientSize()
+                regions = anim.GetRegions(w, h)
                 self.animations[i].SetFrames([HashCmds(cmdList, region)
                                               for cmdList, region in zip(anim.cmdMatrix, regions)])
                 self.animations[i].SetActive(True)
@@ -337,7 +338,8 @@ class AnimationController(wx.EvtHandler):
                     self.animations[i].SetActive(False)
                     continue
                 anim = [anim for anim in self.animationData if anim.windowIndex == i][0]
-                regions = anim.GetRegions()
+                w, h = self.mapwindows[i].GetClientSize()
+                regions = anim.GetRegions(w, h)
                 identifiers = sampleCmdMatrixAndCreateNames(anim.cmdMatrix,
                                                             mapNamesDict[anim.firstStdsNameType[0]],
                                                             regions)
@@ -371,7 +373,8 @@ class AnimationController(wx.EvtHandler):
 
     def _set2DData(self, animationData):
         opacities = [layer.opacity for layer in animationData.layerList if layer.active]
-        regions = animationData.GetRegions()
+        w, h = self.mapwindows[animationData.GetWindowIndex()].GetClientSize()
+        regions = animationData.GetRegions(w, h)
         self.bitmapProvider.SetCmds(animationData.cmdMatrix, opacities, regions)
 
     def _load3DData(self, animationData):

+ 10 - 3
gui/wxpython/animation/data.py

@@ -210,12 +210,12 @@ class AnimationData(object):
 
     zoomRegionValue = property(fset=SetZoomRegionValue, fget=GetZoomRegionValue)
 
-    def GetRegions(self):
-        self._computeRegions(self._mapCount, self._startRegion,
+    def GetRegions(self, width, height):
+        self._computeRegions(width, height, self._mapCount, self._startRegion,
                              self._endRegion, self._zoomRegionValue)
         return self._regions
 
-    def _computeRegions(self, count, startRegion, endRegion=None, zoomValue=None):
+    def _computeRegions(self, width, height, count, startRegion, endRegion=None, zoomValue=None):
         """Computes regions based on start region and end region or zoom value
         for each of the animation frames."""
         currRegion = dict(gcore.region())  # cast to dict, otherwise deepcopy error
@@ -255,6 +255,13 @@ class AnimationData(object):
                 if regions[i]['n'] < regions[i]['s'] or \
                    regions[i]['e'] < regions[i]['w']:
                         regions[i] = regions[i - 1]
+
+        for region in regions:
+            mapwidth = abs(region['e'] - region['w'])
+            mapheight = abs(region['n'] - region['s'])
+            region['nsres'] = mapheight / height
+            region['ewres'] = mapwidth / width
+
         self._regions = regions
 
     def __repr__(self):