vncRegion.cpp
上传用户:sbftbdw
上传日期:2007-01-03
资源大小:379k
文件大小:4k
源码类别:

远程控制编程

开发平台:

Visual C++

  1. //  Copyright (C) 1997, 1998 Olivetti & Oracle Research Laboratory
  2. //
  3. //  This file is part of the VNC system.
  4. //
  5. //  The VNC system is free software; you can redistribute it and/or modify
  6. //  it under the terms of the GNU General Public License as published by
  7. //  the Free Software Foundation; either version 2 of the License, or
  8. //  (at your option) any later version.
  9. //
  10. //  This program is distributed in the hope that it will be useful,
  11. //  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. //  GNU General Public License for more details.
  14. //
  15. //  You should have received a copy of the GNU General Public License
  16. //  along with this program; if not, write to the Free Software
  17. //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
  18. //  USA.
  19. //
  20. // If the source code for the VNC system is not available from the place 
  21. // whence you received this file, check http://www.orl.co.uk/vnc or contact
  22. // the authors on vnc@orl.co.uk for information on obtaining it.
  23. // vncRegion implementation
  24. // This implementation uses the system region handling routines
  25. // to speed things up and give the best results
  26. #include "stdhdrs.h"
  27. // Header
  28. #include "vncRegion.h"
  29. // Implementation
  30. vncRegion::vncRegion()
  31. {
  32. region = NULL;
  33. }
  34. vncRegion::~vncRegion()
  35. {
  36. Clear();
  37. }
  38. void vncRegion::AddRect(RECT &new_rect)
  39. {
  40. HRGN newregion;
  41. if (region == NULL)
  42. {
  43. // Create the region and set it to contain this rectangle
  44. region = CreateRectRgnIndirect(&new_rect);
  45. }
  46. else
  47. {
  48. // Create a new region containing the appropriate rectangle
  49. newregion = CreateRectRgnIndirect(&new_rect);
  50. // Merge it into the existing region
  51. if (CombineRgn(region, region, newregion, RGN_OR) == NULLREGION)
  52. Clear();
  53. // Now delete the temporary region
  54. DeleteObject(newregion);
  55. }
  56. }
  57. void vncRegion::SubtractRect(RECT &new_rect)
  58. {
  59. HRGN newregion;
  60. if (region == NULL)
  61. return;
  62. // Create a new region containing the appropriate rectangle
  63. newregion = CreateRectRgnIndirect(&new_rect);
  64. // Remove it from the existing region
  65. if (CombineRgn(region, region, newregion, RGN_DIFF) == NULLREGION)
  66. Clear();
  67. // Now delete the temporary region
  68. DeleteObject(newregion);
  69. }
  70. void vncRegion::Clear()
  71. {
  72. // Set the region to be empty
  73. if (region != NULL)
  74. {
  75. DeleteObject(region);
  76. region = NULL;
  77. }
  78. }
  79. BOOL vncRegion::IsEmpty()
  80. {
  81. return region == NULL;
  82. }
  83. void
  84. vncRegion::Combine(vncRegion &rgn)
  85. {
  86. if (rgn.region == NULL)
  87. return;
  88. if (region == NULL)
  89. {
  90. region = CreateRectRgn(0, 0, 0, 0);
  91. if (region == NULL)
  92. return;
  93. // Copy the specified region into this one...
  94. if (CombineRgn(region, rgn.region, 0, RGN_COPY) == NULLREGION)
  95. Clear();
  96. return;
  97. }
  98. // Otherwise, combine the two
  99. if (CombineRgn(region, region, rgn.region, RGN_OR) == NULLREGION)
  100. Clear();
  101. }
  102. void
  103. vncRegion::Intersect(vncRegion &rgn)
  104. {
  105. if (rgn.region == NULL)
  106. return;
  107. if (region == NULL)
  108. return;
  109. // Otherwise, intersect the two
  110. if (CombineRgn(region, region, rgn.region, RGN_AND) == NULLREGION)
  111. Clear();
  112. }
  113. void
  114. vncRegion::Subtract(vncRegion &rgn)
  115. {
  116. if (rgn.region == NULL)
  117. return;
  118. if (region == NULL)
  119. return;
  120. // Otherwise, intersect the two
  121. if (CombineRgn(region, region, rgn.region, RGN_DIFF) == NULLREGION)
  122. Clear();
  123. }
  124. // Return all the rectangles
  125. BOOL vncRegion::Rectangles(rectlist &rects)
  126. {
  127. int buffsize;
  128. int x;
  129. RGNDATA *buff;
  130. // If the region is empty then return empty rectangle list
  131. if (region == NULL)
  132. return FALSE;
  133. // Get the size of buffer required
  134. buffsize = GetRegionData(region, NULL, 0);
  135. buff = (RGNDATA *) new BYTE [buffsize];
  136. if (buff == NULL)
  137. return FALSE;
  138. // Now get the region data
  139. if (GetRegionData(region, buffsize, buff))
  140. {
  141. for (x=0; x<(buff->rdh.nCount); x++)
  142. {
  143. // Obtain the rectangles from the list
  144. RECT *rect = (RECT *) (((BYTE *) buff) + sizeof(RGNDATAHEADER) + x * sizeof(RECT));
  145. rects.push_front(*rect);
  146. }
  147. }
  148. // Delete the temporary buffer
  149. delete [] buff;
  150. // Return whether there are any rects!
  151. return !rects.empty();
  152. }
  153. // Return rectangles clipped to a certain area
  154. BOOL vncRegion::Rectangles(rectlist &rects, RECT &cliprect)
  155. {
  156. vncRegion cliprgn;
  157. // Create the clip-region
  158. cliprgn.AddRect(cliprect);
  159. // Calculate the intersection with this region
  160. cliprgn.Intersect(*this);
  161. return cliprgn.Rectangles(rects);
  162. }