tkMacRegion.c
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:5k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* 
  2.  * tkMacRegion.c --
  3.  *
  4.  * Implements X window calls for manipulating regions
  5.  *
  6.  * Copyright (c) 1995-1996 Sun Microsystems, Inc.
  7.  *
  8.  * See the file "license.terms" for information on usage and redistribution
  9.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  10.  *
  11.  * RCS: @(#) $Id: tkMacRegion.c,v 1.4 2002/06/14 13:35:49 dkf Exp $
  12.  */
  13. #include "tkInt.h"
  14. #include "tkMacInt.h"
  15. #include "X.h"
  16. #include "Xlib.h"
  17. #include <Windows.h>
  18. #include <QDOffscreen.h>
  19. /*
  20.  * Temporary region that can be reused.
  21.  */
  22. static RgnHandle tmpRgn = NULL;
  23. /*
  24.  *----------------------------------------------------------------------
  25.  *
  26.  * TkCreateRegion --
  27.  *
  28.  * Implements the equivelent of the X window function
  29.  * XCreateRegion.  See X window documentation for more details.
  30.  *
  31.  * Results:
  32.  *      Returns an allocated region handle.
  33.  *
  34.  * Side effects:
  35.  * None.
  36.  *
  37.  *----------------------------------------------------------------------
  38.  */
  39. TkRegion
  40. TkCreateRegion()
  41. {
  42.     RgnHandle rgn;
  43.     rgn = NewRgn();
  44.     return (TkRegion) rgn;
  45. }
  46. /*
  47.  *----------------------------------------------------------------------
  48.  *
  49.  * TkDestroyRegion --
  50.  *
  51.  * Implements the equivelent of the X window function
  52.  * XDestroyRegion.  See X window documentation for more details.
  53.  *
  54.  * Results:
  55.  * None.
  56.  *
  57.  * Side effects:
  58.  * Memory is freed.
  59.  *
  60.  *----------------------------------------------------------------------
  61.  */
  62. void 
  63. TkDestroyRegion(
  64.     TkRegion r)
  65. {
  66.     RgnHandle rgn = (RgnHandle) r;
  67.     DisposeRgn(rgn);
  68. }
  69. /*
  70.  *----------------------------------------------------------------------
  71.  *
  72.  * TkIntersectRegion --
  73.  *
  74.  * Implements the equivilent of the X window function
  75.  * XIntersectRegion.  See X window documentation for more details.
  76.  *
  77.  * Results:
  78.  * None.
  79.  *
  80.  * Side effects:
  81.  * None.
  82.  *
  83.  *----------------------------------------------------------------------
  84.  */
  85. void 
  86. TkIntersectRegion(
  87.     TkRegion sra,
  88.     TkRegion srb,
  89.     TkRegion dr_return)
  90. {
  91.     RgnHandle srcRgnA = (RgnHandle) sra;
  92.     RgnHandle srcRgnB = (RgnHandle) srb;
  93.     RgnHandle destRgn = (RgnHandle) dr_return;
  94.     SectRgn(srcRgnA, srcRgnB, destRgn);
  95. }
  96. /*
  97.  *----------------------------------------------------------------------
  98.  *
  99.  * TkUnionRectWithRegion --
  100.  *
  101.  * Implements the equivelent of the X window function
  102.  * XUnionRectWithRegion.  See X window documentation for more
  103.  * details.
  104.  *
  105.  * Results:
  106.  * None.
  107.  *
  108.  * Side effects:
  109.  * None.
  110.  *
  111.  *----------------------------------------------------------------------
  112.  */
  113. void 
  114. TkUnionRectWithRegion(
  115.     XRectangle* rectangle,
  116.     TkRegion src_region,
  117.     TkRegion dest_region_return)
  118. {
  119.     RgnHandle srcRgn = (RgnHandle) src_region;
  120.     RgnHandle destRgn = (RgnHandle) dest_region_return;
  121.     if (tmpRgn == NULL) {
  122. tmpRgn = NewRgn();
  123.     }
  124.     SetRectRgn(tmpRgn, rectangle->x, rectangle->y,
  125.     rectangle->x + rectangle->width, rectangle->y + rectangle->height);
  126.     UnionRgn(srcRgn, tmpRgn, destRgn);
  127. }
  128. /*
  129.  *----------------------------------------------------------------------
  130.  *
  131.  * TkRectInRegion --
  132.  *
  133.  * Implements the equivelent of the X window function
  134.  * XRectInRegion.  See X window documentation for more details.
  135.  *
  136.  * Results:
  137.  * Returns one of: RectangleOut, RectangleIn, RectanglePart.
  138.  *
  139.  * Side effects:
  140.  * None.
  141.  *
  142.  *----------------------------------------------------------------------
  143.  */
  144. int 
  145. TkRectInRegion(
  146.     TkRegion region,
  147.     int x,
  148.     int y,
  149.     unsigned int width,
  150.     unsigned int height)
  151. {
  152.     RgnHandle rgn = (RgnHandle) region;
  153.     RgnHandle rectRgn, destRgn;
  154.     int result;
  155.     
  156.     rectRgn = NewRgn();
  157.     destRgn = NewRgn();
  158.     SetRectRgn(rectRgn, x,  y, x + width, y + height);
  159.     SectRgn(rgn, rectRgn, destRgn);
  160.     if (EmptyRgn(destRgn)) {
  161.      result = RectangleOut;
  162.     } else if (EqualRgn(rgn, destRgn)) {
  163.      result = RectangleIn;
  164.     } else {
  165.      result = RectanglePart;
  166.     }
  167.     DisposeRgn(rectRgn);
  168.     DisposeRgn(destRgn);
  169.     return result;
  170. }
  171. /*
  172.  *----------------------------------------------------------------------
  173.  *
  174.  * TkClipBox --
  175.  *
  176.  * Implements the equivelent of the X window function XClipBox.
  177.  * See X window documentation for more details.
  178.  *
  179.  * Results:
  180.  * None.
  181.  *
  182.  * Side effects:
  183.  * None.
  184.  *
  185.  *----------------------------------------------------------------------
  186.  */
  187. void 
  188. TkClipBox(
  189.     TkRegion r,
  190.     XRectangle* rect_return)
  191. {
  192.     RgnHandle rgn = (RgnHandle) r;
  193.     rect_return->x = (**rgn).rgnBBox.left;
  194.     rect_return->y = (**rgn).rgnBBox.top;
  195.     rect_return->width = (**rgn).rgnBBox.right - (**rgn).rgnBBox.left;
  196.     rect_return->height = (**rgn).rgnBBox.bottom - (**rgn).rgnBBox.top;
  197. }
  198. /*
  199.  *----------------------------------------------------------------------
  200.  *
  201.  * TkSubtractRegion --
  202.  *
  203.  * Implements the equivilent of the X window function
  204.  * XSubtractRegion.  See X window documentation for more details.
  205.  *
  206.  * Results:
  207.  * None.
  208.  *
  209.  * Side effects:
  210.  * None.
  211.  *
  212.  *----------------------------------------------------------------------
  213.  */
  214. void 
  215. TkSubtractRegion(
  216.     TkRegion sra,
  217.     TkRegion srb,
  218.     TkRegion dr_return)
  219. {
  220.     RgnHandle srcRgnA = (RgnHandle) sra;
  221.     RgnHandle srcRgnB = (RgnHandle) srb;
  222.     RgnHandle destRgn = (RgnHandle) dr_return;
  223.     DiffRgn(srcRgnA, srcRgnB, destRgn);
  224. }