⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rect.c

📁 linux下的图形界面开发minigui最新源代码
💻 C
字号:
/*** $Id: rect.c,v 1.4 2003/09/04 06:02:53 weiym Exp $**** rect.c: Rectangle operations of GDI.**** Copyright (C) 2003 Feynman Software** Copyright (C) 2001 ~ 2002 Wei Yongming.**** Current maintainer: Wei Yongming.**** Create date: 2000/06/12, derived from original gdi.c*//*** This program 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 program 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 program; if not, write to the Free Software** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA*//*** TODO:*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include "common.h"/**************************** Rectangle support ******************************/BOOL GUIAPI IsRectEmpty(const RECT* prc){    if( prc->left == prc->right ) return TRUE;    if( prc->top == prc->bottom ) return TRUE;    return FALSE;}BOOL GUIAPI EqualRect(const RECT* prc1, const RECT* prc2){    if(prc1->left != prc2->left) return FALSE;    if(prc1->top != prc2->top) return FALSE;    if(prc1->right != prc2->right) return FALSE;    if(prc1->bottom != prc2->bottom) return FALSE;    return TRUE;}void GUIAPI NormalizeRect(RECT* pRect){    int iTemp;    if(pRect->left > pRect->right)    {         iTemp = pRect->left;         pRect->left = pRect->right;         pRect->right = iTemp;    }    if(pRect->top > pRect->bottom)    {         iTemp = pRect->top;         pRect->top = pRect->bottom;         pRect->bottom = iTemp;    }}BOOL GUIAPI IsCovered(const RECT* prc1, const RECT* prc2){    if (prc1->left < prc2->left            || prc1->top < prc2->top            || prc1->right > prc2->right            || prc1->bottom > prc2->bottom)        return FALSE;    return TRUE;}BOOL GUIAPI IntersectRect(RECT* pdrc, const RECT* psrc1, const RECT* psrc2){    pdrc->left = (psrc1->left > psrc2->left) ? psrc1->left : psrc2->left;    pdrc->top  = (psrc1->top > psrc2->top) ? psrc1->top : psrc2->top;    pdrc->right = (psrc1->right < psrc2->right) ? psrc1->right : psrc2->right;    pdrc->bottom = (psrc1->bottom < psrc2->bottom)                    ? psrc1->bottom : psrc2->bottom;    if(pdrc->left >= pdrc->right || pdrc->top >= pdrc->bottom)        return FALSE;    return TRUE;}BOOL GUIAPI DoesIntersect (const RECT* psrc1, const RECT* psrc2){    int left, top, right, bottom;        left = (psrc1->left > psrc2->left) ? psrc1->left : psrc2->left;    top  = (psrc1->top > psrc2->top) ? psrc1->top : psrc2->top;    right = (psrc1->right < psrc2->right) ? psrc1->right : psrc2->right;    bottom = (psrc1->bottom < psrc2->bottom)                    ? psrc1->bottom : psrc2->bottom;    if(left >= right || top >= bottom)        return FALSE;    return TRUE;}BOOL GUIAPI UnionRect(RECT* pdrc, const RECT* psrc1, const RECT* psrc2){    RECT src1, src2;    memcpy(&src1, psrc1, sizeof(RECT));    memcpy(&src2, psrc2, sizeof(RECT));    NormalizeRect(&src1);    NormalizeRect(&src2);    if (src1.left == src2.left         && src1.right == src2.right) {        if (src1.top <= src2.top && src2.top <= src1.bottom) {            pdrc->left = src1.left;            pdrc->right = src1.right;            pdrc->top = src1.top;            pdrc->bottom = MAX(src1.bottom, src2.bottom);            return TRUE;        }        else if (src1.top >= src2.top && src2.bottom >= src1.top) {            pdrc->left = src1.left;            pdrc->right = src1.right;            pdrc->top = src2.top;            pdrc->bottom = MAX(src1.bottom, src2.bottom);            return TRUE;       }       return FALSE;    }    if (src1.top == src2.top         && src1.bottom == src2.bottom) {        if (src1.left <= src2.left && src2.left <= src1.right) {            pdrc->top = src1.top;            pdrc->bottom = src1.bottom;            pdrc->left = src1.left;            pdrc->right = MAX(src1.right, src2.right);            return TRUE;        }        else if (src1.left >= src2.left && src2.right >= src1.left) {            pdrc->top = src1.top;            pdrc->bottom = src1.bottom;            pdrc->left = src2.left;            pdrc->right = MAX(src1.right, src2.right);            return TRUE;       }       return FALSE;    }    return FALSE;}void GUIAPI GetBoundRect(PRECT pdrc,  const RECT* psrc1, const RECT* psrc2){    RECT src1, src2;    memcpy(&src1, psrc1, sizeof(RECT));    memcpy(&src2, psrc2, sizeof(RECT));    NormalizeRect(&src1);    NormalizeRect(&src2);    pdrc->left = (src1.left < src2.left) ? src1.left : src2.left;    pdrc->top  = (src1.top < src2.top) ? src1.top : src2.top;    pdrc->right = (src1.right > src2.right) ? src1.right : src2.right;    pdrc->bottom = (src1.bottom > src2.bottom)                    ? src1.bottom : src2.bottom;}int GUIAPI SubtractRect(RECT* rc, const RECT* psrc1, const RECT* psrc2){    RECT src, rcExpect, *prcExpect;    int nCount = 0;        src = *psrc1;    rcExpect = *psrc2;    prcExpect = &rcExpect;    if (!DoesIntersect (&src, prcExpect)) {        nCount = 1;        rc[0] = src;    }    else {        if(prcExpect->top > src.top)        {            rc[nCount].left  = src.left;            rc[nCount].top   = src.top;            rc[nCount].right = src.right;            rc[nCount].bottom = prcExpect->top;            nCount++;            src.top = prcExpect->top;        }        if(prcExpect->bottom < src.bottom)        {            rc[nCount].top  = prcExpect->bottom;            rc[nCount].left   = src.left;            rc[nCount].right = src.right;            rc[nCount].bottom = src.bottom;            nCount++;            src.bottom = prcExpect->bottom;        }        if(prcExpect->left > src.left)        {            rc[nCount].left  = src.left;            rc[nCount].top   = src.top;            rc[nCount].right = prcExpect->left;            rc[nCount].bottom = src.bottom;            nCount++;        }        if(prcExpect->right < src.right)        {            rc[nCount].left  = prcExpect->right;            rc[nCount].top   = src.top;            rc[nCount].right = src.right;            rc[nCount].bottom = src.bottom;            nCount++;        }    }    return nCount;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -