]> source.dussan.org Git - tigervnc.git/commitdiff
Get rid of magical assignment to Region 1009/head
authorPierre Ossman <ossman@cendio.se>
Fri, 1 May 2020 15:37:04 +0000 (17:37 +0200)
committerPierre Ossman <ossman@cendio.se>
Mon, 18 May 2020 11:34:19 +0000 (13:34 +0200)
Might as well make these explicit so the cost is apparent.

common/rfb/ComparingUpdateTracker.cxx
common/rfb/Region.cxx
common/rfb/Region.h
unix/xserver/hw/vnc/vncExtInit.cc
unix/xserver/hw/vnc/vncExtInit.h
unix/xserver/hw/vnc/vncHooks.c

index 237adc41bef6f0fc5187de601b42c72118fec847..d5651200c4237a1030fd5117cde2b09af20636f9 100644 (file)
@@ -120,8 +120,6 @@ void ComparingUpdateTracker::compareRect(const Rect& r, Region* newChanged)
   rdr::U8* oldData = oldFb.getBufferRW(r, &oldStride);
   int oldStrideBytes = oldStride * bytesPerPixel;
 
-  std::vector<Rect> changedBlocks;
-
   for (int blockTop = r.tl.y; blockTop < r.br.y; blockTop += BLOCK_SIZE)
   {
     // Get a strip of the source buffer
@@ -146,8 +144,8 @@ void ComparingUpdateTracker::compareRect(const Rect& r, Region* newChanged)
         if (memcmp(oldPtr, newPtr, blockWidthInBytes) != 0)
         {
           // A block has changed - copy the remainder to the oldFb
-          changedBlocks.push_back(Rect(blockLeft, blockTop,
-                                       blockRight, blockBottom));
+          newChanged->assign_union(Region(Rect(blockLeft, blockTop,
+                                               blockRight, blockBottom)));
           for (int y2 = y; y2 < blockBottom; y2++)
           {
             memcpy(oldPtr, newPtr, blockWidthInBytes);
@@ -169,12 +167,6 @@ void ComparingUpdateTracker::compareRect(const Rect& r, Region* newChanged)
   }
 
   oldFb.commitBufferRW(r);
-
-  if (!changedBlocks.empty()) {
-    Region temp;
-    temp.setOrderedRects(changedBlocks);
-    newChanged->assign_union(temp);
-  }
 }
 
 void ComparingUpdateTracker::logStats()
index 17170fa6749d99989c8c8129cc9042051889f9e3..2664fb11badb258fc9c20a33aa861210f3b93b78 100644 (file)
@@ -67,25 +67,6 @@ void rfb::Region::translate(const Point& delta) {
   pixman_region_translate(rgn, delta.x, delta.y);
 }
 
-void rfb::Region::setOrderedRects(const std::vector<Rect>& rects) {
-  clear();
-  std::vector<Rect>::const_iterator i;
-  for (i=rects.begin(); i != rects.end(); i++)
-    pixman_region_union_rect(rgn, rgn, i->tl.x, i->tl.y, i->width(), i->height());
-}
-
-void rfb::Region::setExtentsAndOrderedRects(const ShortRect* extents,
-                                            int nRects, const ShortRect* rects)
-{
-  clear();
-  std::vector<Rect>::const_iterator i;
-  for (int i = 0; i < nRects; i++) {
-    pixman_region_union_rect(rgn, rgn, rects[i].x1, rects[i].y1,
-                             rects[i].x2 - rects[i].x1,
-                             rects[i].y2 - rects[i].y1);
-  }
-}
-
 void rfb::Region::assign_intersect(const rfb::Region& r) {
   pixman_region_intersect(rgn, rgn, r.rgn);
 }
index ef26aa7c885fe755cad992a04131011206be6f01..6ac3a75b555026ff950607fe0e588c2d953549f8 100644 (file)
@@ -29,10 +29,6 @@ struct pixman_region16;
 
 namespace rfb {
 
-  struct ShortRect {
-    short x1, y1, x2, y2;
-  };
-
   class Region {
   public:
     // Create an empty region
@@ -50,9 +46,6 @@ namespace rfb {
     void clear();
     void reset(const Rect& r);
     void translate(const rfb::Point& delta);
-    void setOrderedRects(const std::vector<Rect>& rects);
-    void setExtentsAndOrderedRects(const ShortRect* extents, int nRects,
-                                   const ShortRect* rects);
 
     void assign_intersect(const Region& r);
     void assign_union(const Region& r);
index 6ab306b142dcf73b40eb701002359169031b73b6..d05bf85b5fe14e86e146ba564883a6469cc3d957 100644 (file)
@@ -150,9 +150,6 @@ void vncExtensionInit(void)
   if (vncGetScreenCount() > MAXSCREENS)
     vncFatalError("vncExtensionInit: too many screens");
 
-  if (sizeof(ShortRect) != sizeof(struct UpdateRect))
-    vncFatalError("vncExtensionInit: Incompatible ShortRect size");
-
   vncAddExtension();
 
   vncSelectionInit();
@@ -372,25 +369,24 @@ void vncSetLEDState(unsigned long leds)
     desktop[scr]->setLEDState(state);
 }
 
-void vncAddChanged(int scrIdx, const struct UpdateRect *extents,
-                   int nRects, const struct UpdateRect *rects)
+void vncAddChanged(int scrIdx, int nRects,
+                   const struct UpdateRect *rects)
 {
-  Region reg;
-
-  reg.setExtentsAndOrderedRects((const ShortRect*)extents,
-                                nRects, (const ShortRect*)rects);
-  desktop[scrIdx]->add_changed(reg);
+  for (int i = 0;i < nRects;i++) {
+    desktop[scrIdx]->add_changed(Region(Rect(rects[i].x1, rects[i].y1,
+                                             rects[i].x2, rects[i].y2)));
+  }
 }
 
-void vncAddCopied(int scrIdx, const struct UpdateRect *extents,
-                  int nRects, const struct UpdateRect *rects,
+void vncAddCopied(int scrIdx, int nRects,
+                  const struct UpdateRect *rects,
                   int dx, int dy)
 {
-  Region reg;
-
-  reg.setExtentsAndOrderedRects((const ShortRect*)extents,
-                                nRects, (const ShortRect*)rects);
-  desktop[scrIdx]->add_copied(reg, rfb::Point(dx, dy));
+  for (int i = 0;i < nRects;i++) {
+    desktop[scrIdx]->add_copied(Region(Rect(rects[i].x1, rects[i].y1,
+                                            rects[i].x2, rects[i].y2)),
+                                Point(dx, dy));
+  }
 }
 
 void vncSetCursor(int width, int height, int hotX, int hotY,
index 1fb87c1954c47e99d253941b28585a412c2ea0d7..23c0c6699fb98165f9564b5473ae03bae0bd7d4a 100644 (file)
@@ -73,10 +73,10 @@ struct UpdateRect {
   short x1, y1, x2, y2;
 };
 
-void vncAddChanged(int scrIdx, const struct UpdateRect *extents,
-                   int nRects, const struct UpdateRect *rects);
-void vncAddCopied(int scrIdx, const struct UpdateRect *extents,
-                  int nRects, const struct UpdateRect *rects,
+void vncAddChanged(int scrIdx, int nRects,
+                   const struct UpdateRect *rects);
+void vncAddCopied(int scrIdx, int nRects,
+                  const struct UpdateRect *rects,
                   int dx, int dy);
 
 void vncSetCursor(int width, int height, int hotX, int hotY,
index f631941bb6f5cb3f0eb415c0c292c9b927ba82ef..a8ab917b86605f45d50f7f038b1ba5572b19253d 100644 (file)
@@ -340,7 +340,6 @@ static inline void add_changed(ScreenPtr pScreen, RegionPtr reg)
   if (RegionNil(reg))
     return;
   vncAddChanged(pScreen->myNum,
-                (const struct UpdateRect*)RegionExtents(reg),
                 RegionNumRects(reg),
                 (const struct UpdateRect*)RegionRects(reg));
 }
@@ -354,7 +353,6 @@ static inline void add_copied(ScreenPtr pScreen, RegionPtr dst,
   if (RegionNil(dst))
     return;
   vncAddCopied(pScreen->myNum,
-               (const struct UpdateRect*)RegionExtents(dst),
                RegionNumRects(dst),
                (const struct UpdateRect*)RegionRects(dst), dx, dy);
 }