1a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#ifndef SRAREGION_H
2a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#define SRAREGION_H
3a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
4a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/* -=- SRA - Simple Region Algorithm
5a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * A simple rectangular region implementation.
6a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * Copyright (c) 2001 James "Wez" Weatherall, Johannes E. Schindelin
7a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat */
8a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
9a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/* -=- sraRect */
10a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
11a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehattypedef struct _rect {
12a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	int x1;
13a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	int y1;
14a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	int x2;
15a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	int y2;
16a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} sraRect;
17a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
18a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehattypedef struct sraRegion sraRegion;
19a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
20a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/* -=- Region manipulation functions */
21a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
22a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatextern sraRegion *sraRgnCreate();
23a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatextern sraRegion *sraRgnCreateRect(int x1, int y1, int x2, int y2);
24a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatextern sraRegion *sraRgnCreateRgn(const sraRegion *src);
25a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
26a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatextern void sraRgnDestroy(sraRegion *rgn);
27a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatextern void sraRgnMakeEmpty(sraRegion *rgn);
28a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatextern rfbBool sraRgnAnd(sraRegion *dst, const sraRegion *src);
29a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatextern void sraRgnOr(sraRegion *dst, const sraRegion *src);
30a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatextern rfbBool sraRgnSubtract(sraRegion *dst, const sraRegion *src);
31a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
32a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatextern void sraRgnOffset(sraRegion *dst, int dx, int dy);
33a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
34a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatextern rfbBool sraRgnPopRect(sraRegion *region, sraRect *rect,
35a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			  unsigned long flags);
36a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
37a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatextern unsigned long sraRgnCountRects(const sraRegion *rgn);
38a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatextern rfbBool sraRgnEmpty(const sraRegion *rgn);
39a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
40a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatextern sraRegion *sraRgnBBox(const sraRegion *src);
41a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
42a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/* -=- rectangle iterator */
43a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
44a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehattypedef struct sraRectangleIterator {
45a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat  rfbBool reverseX,reverseY;
46a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat  int ptrSize,ptrPos;
47a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat  struct sraSpan** sPtrs;
48a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} sraRectangleIterator;
49a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
50a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatextern sraRectangleIterator *sraRgnGetIterator(sraRegion *s);
51a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatextern sraRectangleIterator *sraRgnGetReverseIterator(sraRegion *s,rfbBool reverseX,rfbBool reverseY);
52a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatextern rfbBool sraRgnIteratorNext(sraRectangleIterator *i,sraRect *r);
53a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatextern void sraRgnReleaseIterator(sraRectangleIterator *i);
54a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
55a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatvoid sraRgnPrint(const sraRegion *s);
56a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
57a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/* -=- Rectangle clipper (for speed) */
58a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
59a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatextern rfbBool sraClipRect(int *x, int *y, int *w, int *h,
60a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			int cx, int cy, int cw, int ch);
61a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
62a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatextern rfbBool sraClipRect2(int *x, int *y, int *x2, int *y2,
63a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat			int cx, int cy, int cx2, int cy2);
64a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
65a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#endif
66