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

📄 drawings.c

📁 具有IDE功能的编辑器
💻 C
字号:
/* drawings.c - for doing modifiable line drawings in a window   Copyright (C) 1996-2000 Paul Sheer   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. */#define DRAWINGS_C#include <config.h>#include <stdio.h>#include <my_string.h>#include <stdlib.h>#include <X11/Xlib.h>#include <X11/Xutil.h>#include <X11/Xresource.h>#include "lkeysym.h"#include "stringtools.h"#include "app_glob.c"#include "coolwidget.h"#include "coollocal.h"#include "mad.h"#include "drawings.h"/*    the bounds are the maximum extents of the elements.    only events withing the bounds are evaluated.*/void extendbounds (CWidget *wdt, int x1, int y1, int x2, int y2){    int xb = max (x1, x2);    int xa = min (x1, x2);    int yb = max (y1, y2);    int ya = min (y1, y2);    if (wdt->pic->x1 > xa)	wdt->pic->x1 = xa;    if (wdt->pic->x2 < xb)	wdt->pic->x2 = xb;    if (wdt->pic->y1 > ya)	wdt->pic->y1 = ya;    if (wdt->pic->y2 < yb)	wdt->pic->y2 = yb;}/* returns 1 on error */int CSetDrawingTarget (const char *picture_ident){    return (!(CDrawTarget = CIdent(picture_ident)));}void expose_picture(CWidget *wdt){    CExposeWindowArea (wdt->parentid, 0, wdt->pic->x1 + wdt->x,	wdt->pic->y1 + wdt->y, wdt->pic->x2 - wdt->pic->x1 + 1,	wdt->pic->y2 - wdt->pic->y1 + 1);}void destroy_picture (CWidget *wdt){    if (wdt->pic->pp) {	free (wdt->pic->pp);	wdt->pic->pp = 0;    }    if (wdt->pic) {	free (wdt->pic);	wdt->pic->pp = 0;    }}void cw_reboundpic(CWidget *wdt){    int j;    wdt->pic->x1 = 30000;    wdt->pic->x2 = -30000;    wdt->pic->y1 = 30000;    wdt->pic->y2 = -30000;    if (wdt->pic->numelements) {	for (j = 0; j < wdt->pic->numelements; j++) {	    CPicturePrimative *pp = &(wdt->pic->pp[j]);	    switch (pp->type) {	    case CRECTANGLE:	    case CFILLED_RECTANGLE:		extendbounds (wdt, pp->x, pp->y, pp->x + pp->a, pp->y + pp->b);		break;	    case CLINE:		extendbounds (wdt, pp->x, pp->y, pp->a, pp->b);		break;	    }	}    }}CWidget *CDrawPicture (const char *identifier, Window parent, int x, int y,		int max_num_elements){    CWidget **w;    w = find_empty_widget_entry (); /*find first unused list entry in list of widgets*/    *w = allocate_widget (0, identifier, parent, x, y,		       0, 0, C_PICTURE_WIDGET);    (*w)->pic = CMalloc(sizeof(CPicture));    memset((*w)->pic, 0, sizeof(CPicture));    (*w)->pic->pp = CMalloc(sizeof(CPicturePrimative) * max_num_elements);    cw_reboundpic(*w);    (*w)->eh = default_event_handler(C_PICTURE_WIDGET);    (*w)->destroy = destroy_picture;    CSetDrawingTarget (identifier);    return (*w);}void CClearPicture(void){    CWidget *wdt = CDrawTarget;    wdt->pic->numelements = 0;    expose_picture (wdt);    cw_reboundpic(wdt);}int CDrawLine (float x1, float y1, float x2, float y2, unsigned long c){    CWidget *wdt = CDrawTarget;    int last = wdt->pic->numelements;    wdt->pic->pp[last].x = x1;    wdt->pic->pp[last].y = y1;    wdt->pic->pp[last].a = x2;    wdt->pic->pp[last].b = y2;    wdt->pic->pp[last].color = c;    wdt->pic->pp[last].type = CLINE;    wdt->pic->numelements++;    extendbounds (wdt, x1, y1, x2, y2);    expose_picture (wdt);    return last;}int CDrawRectangle (float x, float y, float w, float h, unsigned long c){    CWidget *wdt = CDrawTarget;    int last = wdt->pic->numelements;    wdt->pic->pp[last].x = x;    wdt->pic->pp[last].y = y;    wdt->pic->pp[last].a = w;    wdt->pic->pp[last].b = h;    wdt->pic->pp[last].color = c;    wdt->pic->pp[last].type = CRECTANGLE;    wdt->pic->numelements++;    extendbounds (wdt, x, y, x +  w, y + h);    expose_picture (wdt);    return last;}void CRemovePictureElement (int j){    if (CDrawTarget->pic->numelements <= j || j < 0)	return;    if (CDrawTarget->pic->numelements - 1 == j)	CDrawTarget->pic->numelements--;    else	CDrawTarget->pic->pp[j].type = 0;    expose_picture (CDrawTarget);    cw_reboundpic(CDrawTarget);}void CScalePicture (float s){    CWidget *wdt = CDrawTarget;    int j = 0;    if (s == 1)	return;    if (s < 1)	expose_picture (wdt);    for (; j < wdt->pic->numelements; j++) {	CPicturePrimative *pp = &(wdt->pic->pp[j]);	pp->x *= s;	pp->y *= s;	pp->a *= s;	pp->b *= s;    }    wdt->pic->x1 *= s;    wdt->pic->x2 *= s;    wdt->pic->y1 *= s;    wdt->pic->y2 *= s;    cw_reboundpic (wdt);    if (s > 1)	expose_picture (wdt);}#define is_between(a,b,c) \		    ((a) >= (b) && (a) <= (c))int eh_picture (CWidget *wdt, XEvent * xevent, CEvent * cwevent){    int last = wdt->pic->numelements;    CPicturePrimative *pp = wdt->pic->pp;    Window win = wdt->parentid;    int x = wdt->x;    int y = wdt->y;    switch (xevent->type) {    case Expose:	if (last) {/* check if the expose covers the region of the picture */	    int w = max (max (xevent->xexpose.x, xevent->xexpose.x + xevent->xexpose.width),			 wdt->pic->x2 + x)	    - min (min (xevent->xexpose.x, xevent->xexpose.x + xevent->xexpose.width),		   wdt->pic->x1 + x);	    int h = max (max (xevent->xexpose.y, xevent->xexpose.y + xevent->xexpose.height),			 wdt->pic->y2 + y)	    - min (min (xevent->xexpose.y, xevent->xexpose.y + xevent->xexpose.height),		   wdt->pic->y1 + y);	    if (h < wdt->pic->y2 - wdt->pic->y1 + abs (xevent->xexpose.height)		&& w < wdt->pic->x2 - wdt->pic->x1 + abs (xevent->xexpose.width)) {		int j = 0;		for (; j < last; j++)		    switch (pp[j].type) {		    case CLINE:			CSetColor (pp[j].color);			CLine (win, pp[j].x + x, pp[j].y + y, pp[j].a + x, pp[j].b + y);			break;		    case CFILLED_RECTANGLE:			CSetColor (pp[j].color);			CRectangle (win, pp[j].x + x, pp[j].y + y, pp[j].a, pp[j].b);			break;		    case CRECTANGLE:			CSetColor (pp[j].color);			CLine (win, pp[j].x + x, pp[j].y + y, pp[j].x + x + pp[j].a, pp[j].y + y);			CLine (win, pp[j].x + x, pp[j].y + y, pp[j].x + x, pp[j].y + y + pp[j].b);			CLine (win, pp[j].x + x + pp[j].a, pp[j].y + y + pp[j].b, pp[j].x + x + pp[j].a, pp[j].y + y);			CLine (win, pp[j].x + x + pp[j].a, pp[j].y + y + pp[j].b, pp[j].x + x, pp[j].y + y + pp[j].b);			break;		    }	    }	}	break;    case ButtonPress:	break;    }    return 0;}

⌨️ 快捷键说明

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