| /* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. |
| * |
| * This is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation; either version 2 of the License, or |
| * (at your option) any later version. |
| * |
| * This software is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this software; if not, write to the Free Software |
| * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
| * USA. |
| */ |
| #ifndef __REGIONHELPER_H__ |
| #define __REGIONHELPER_H__ |
| |
| // RegionHelper is a class which helps in using X server regions by |
| // automatically freeing them in the destructor. It also fixes a problem with |
| // REGION_INIT when given an empty rectangle. |
| |
| // REGION_NULL was introduced in the Xorg tree as the way to initialise an |
| // empty region. If it's not already defined do it the old way. Note that the |
| // old way causes a segfault in the new tree... |
| #ifndef REGION_NULL |
| #define REGION_NULL(pScreen,pReg) REGION_INIT(pScreen,pReg,NullBox,0) |
| #endif |
| |
| class RegionHelper { |
| public: |
| |
| // constructor from a single rect |
| RegionHelper(ScreenPtr pScreen_, BoxPtr rect, int size) |
| : pScreen(pScreen_), reg(0) |
| { |
| init(rect, size); |
| } |
| |
| // constructor from an existing X server region |
| RegionHelper(ScreenPtr pScreen_, RegionPtr pRegion) |
| : pScreen(pScreen_), reg(®Rec) |
| { |
| REGION_NULL(pScreen, reg); |
| REGION_COPY(pScreen, reg, pRegion); |
| } |
| |
| // constructor from an array of rectangles |
| RegionHelper(ScreenPtr pScreen_, int nrects, xRectanglePtr rects, |
| int ctype=CT_NONE) |
| : pScreen(pScreen_) |
| { |
| reg = RECTS_TO_REGION(pScreen, nrects, rects, ctype); |
| } |
| |
| // constructor for calling init() later |
| RegionHelper(ScreenPtr pScreen_) : pScreen(pScreen_), reg(0) { |
| } |
| |
| void init(BoxPtr rect, int size) { |
| reg = ®Rec; |
| if (!rect || (rect && (rect->x2 == rect->x1 || rect->y2 == rect->y1))) { |
| REGION_NULL(pScreen, reg); |
| } else { |
| REGION_INIT(pScreen, reg, rect, size); |
| } |
| } |
| |
| // destructor frees as appropriate |
| ~RegionHelper() { |
| if (reg == ®Rec) { |
| REGION_UNINIT(pScreen, reg); |
| } else if (reg) { |
| REGION_DESTROY(pScreen, reg); |
| } |
| } |
| ScreenPtr pScreen; |
| RegionRec regRec; |
| RegionPtr reg; |
| }; |
| |
| #endif |