rect.c
上传用户:xiaoan1112
上传日期:2013-04-11
资源大小:19621k
文件大小:3k
源码类别:

操作系统开发

开发平台:

Visual C++

  1. /*
  2. COW : Character Oriented Windows
  3. rect.c : Rectangle support
  4. */
  5. #define COW
  6. #include <cow.h>
  7. #define WINDOW
  8. #include <uwindow.h>
  9. #include <inscreen.h>
  10. PUBLIC BOOL FARPUBLIC
  11. PtInRect(prrc, rx, ry)
  12. /*
  13.   -- retuurn TRUE if point is in the rectangle
  14.   -- Works for both rrcs and prrc
  15. */
  16. RX rx;
  17. RY ry;
  18. REGISTER PRRC prrc;
  19. {
  20. StartPublic();
  21. ReturnPublic(rx >= prrc->rxLeft &&
  22. rx < prrc->rxRight &&
  23. ry >= prrc->ryTop &&
  24. ry < prrc->ryBottom, BOOL);
  25. }
  26. PUBLIC VOID FARPUBLIC
  27. SetRect(prrc, rxLeft, ryTop, rxRight, ryBottom)
  28. /*
  29.   -- set the coordinates of a rectangle
  30. */
  31. REGISTER PRRC prrc;
  32. RX rxLeft, rxRight;
  33. RY ryTop, ryBottom;
  34. {
  35. StartPublic();
  36. prrc->rxLeft = rxLeft;
  37. prrc->ryTop = ryTop;
  38. prrc->rxRight = rxRight;
  39. prrc->ryBottom = ryBottom;
  40. StopPublic();
  41. }
  42. PUBLIC BOOL FARPUBLIC
  43. IntersectRect(prrcDest, prrcSrc1, prrcSrc2)
  44. /*
  45.   -- fille *prrcDest with the intersection of two rectangles
  46. */
  47. REGISTER PRRC prrcSrc1;
  48. REGISTER PRRC prrcSrc2;
  49. REGISTER PRRC prrcDest;
  50. {
  51. StartPublic();
  52. prrcDest->rxLeft = max(prrcSrc1->rxLeft, prrcSrc2->rxLeft);
  53. prrcDest->rxRight = min(prrcSrc1->rxRight, prrcSrc2->rxRight);
  54. prrcDest->ryTop = max(prrcSrc1->ryTop, prrcSrc2->ryTop);
  55. prrcDest->ryBottom = min(prrcSrc1->ryBottom, prrcSrc2->ryBottom);
  56. if (IsRectEmpty(prrcDest))
  57. {
  58. prrcDest->rxLeft = 0;
  59. prrcDest->rxRight = 0;
  60. prrcDest->ryTop = 0;
  61. prrcDest->ryBottom = 0;
  62. ReturnPublic(FALSE, BOOL);
  63. }
  64. else
  65. ReturnPublic(TRUE, BOOL);
  66. }
  67. PUBLIC VOID FARPUBLIC
  68. UnionRect(prrcDest, prrcSrc1, prrcSrc2)
  69. /*
  70.   -- fill *prrcDest with the union of two rectangles
  71. */
  72. REGISTER PRRC prrcSrc1, prrcSrc2;
  73. PRRC prrcDest;
  74. {
  75. StartPublic();
  76. if (IsRectEmpty(prrcSrc1))
  77. *prrcDest = *prrcSrc2;
  78. else if (IsRectEmpty(prrcSrc2))
  79. *prrcDest = *prrcSrc1;
  80. else
  81. {
  82. prrcDest->rxLeft = min(prrcSrc1->rxLeft, prrcSrc2->rxLeft);
  83. prrcDest->rxRight = max(prrcSrc1->rxRight, prrcSrc2->rxRight);
  84. prrcDest->ryTop = min(prrcSrc1->ryTop, prrcSrc2->ryTop);
  85. prrcDest->ryBottom =
  86. max(prrcSrc1->ryBottom, prrcSrc2->ryBottom);
  87. }
  88. StopPublic();
  89. }
  90. PUBLIC BOOL FARPUBLIC
  91. IsRectEmpty(prrc)
  92. /*
  93.   -- return TRUE if rectangle is empty
  94. */
  95. REGISTER PRRC prrc;
  96. {
  97. StartPublic();
  98. ReturnPublic(prrc->rxLeft >= prrc->rxRight ||
  99. prrc->ryTop >= prrc->ryBottom, BOOL);
  100. }
  101. PUBLIC WORD FARPUBLIC
  102. CwSizeRrc(prrc)
  103. /*
  104.   -- return the size (in words) needed to save the rectangle
  105.   -- NOTE : also works for ARC's
  106. */
  107. REGISTER PRRC prrc;
  108. {
  109. WORD cw;
  110. cw = ((prrc)->rxRight-(prrc)->rxLeft) *
  111.     ((prrc)->ryBottom-(prrc)->ryTop);
  112. #ifdef SCREEN_FFONT
  113. if (fFontAvailable)
  114. cw *= 2;
  115. #endif /*SCREEN_FFONT*/
  116. return cw;
  117. }