📄 fl_rect.cxx
字号:
//// "$Id: fl_rect.cxx,v 1.1.1.1 2003/08/07 21:18:41 jasonk Exp $"//// Rectangle drawing routines for the Fast Light Tool Kit (FLTK).//// Copyright 1998-1999 by Bill Spitzak and others.//// This library is free software; you can redistribute it and/or// modify it under the terms of the GNU Library General Public// License as published by the Free Software Foundation; either// version 2 of the License, or (at your option) any later version.//// This library 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// Library General Public License for more details.//// You should have received a copy of the GNU Library General Public// License along with this library; if not, write to the Free Software// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307// USA.//// Please report all bugs and problems to "fltk-bugs@easysw.com".//// These routines from fl_draw.H are used by the standard boxtypes// and thus are always linked into an fltk program.// Also all fl_clip routines, since they are always linked in so// that minimal update works.#include <FL/Fl_Widget.H>#include <FL/fl_draw.H>#include <FL/x.H>void fl_rect(int x, int y, int w, int h) { if (w<=0 || h<=0) return;#ifdef WIN32 MoveToEx(fl_gc, x, y, 0L); LineTo(fl_gc, x+w-1, y); LineTo(fl_gc, x+w-1, y+h-1); LineTo(fl_gc, x, y+h-1); LineTo(fl_gc, x, y);#else#ifdef NANO_X GrRect(fl_window, fl_gc, x, y, w, h); // Nano-X draws w and h unlike X#else XDrawRectangle(fl_display, fl_window, fl_gc, x, y, w-1, h-1);#endif#endif}void fl_rectf(int x, int y, int w, int h) { if (w<=0 || h<=0) return;#ifdef WIN32 RECT rect; rect.left = x; rect.top = y; rect.right = x + w; rect.bottom = y + h; FillRect(fl_gc, &rect, fl_brush());#else#ifdef NANO_X if (w && h) GrFillRect(fl_window,fl_gc,x,y,w,h);#else if (w && h) XFillRectangle(fl_display, fl_window, fl_gc, x, y, w, h);#endif#endif}void fl_xyline(int x, int y, int x1) {#ifdef WIN32 MoveToEx(fl_gc, x, y, 0L); LineTo(fl_gc, x1+1, y);#else#ifdef NANO_X GrLine(fl_window,fl_gc,x,y,x1,y);#else XDrawLine(fl_display, fl_window, fl_gc, x, y, x1, y);#endif#endif}void fl_xyline(int x, int y, int x1, int y2) {#ifdef WIN32 if (y2 < y) y2--; else y2++; MoveToEx(fl_gc, x, y, 0L); LineTo(fl_gc, x1, y); LineTo(fl_gc, x1, y2);#else#ifdef NANO_X GR_POINT p[3]; p[0].x = x; p[0].y = p[1].y = y; p[1].x = p[2].x = x1; p[2].y = y2; GrPoly(fl_window,fl_gc,3,p);#else XPoint p[3]; p[0].x = x; p[0].y = p[1].y = y; p[1].x = p[2].x = x1; p[2].y = y2; XDrawLines(fl_display, fl_window, fl_gc, p, 3, 0);#endif#endif}void fl_xyline(int x, int y, int x1, int y2, int x3) {#ifdef WIN32 if(x3 < x1) x3--; else x3++; MoveToEx(fl_gc, x, y, 0L); LineTo(fl_gc, x1, y); LineTo(fl_gc, x1, y2); LineTo(fl_gc, x3, y2);#else#ifdef NANO_X GR_POINT p[4]; p[0].x = x; p[0].y = p[1].y = y; p[1].x = p[2].x = x1; p[2].y = p[3].y = y2; p[3].x = x3; GrPoly(fl_window,fl_gc,4,p);#else XPoint p[4]; p[0].x = x; p[0].y = p[1].y = y; p[1].x = p[2].x = x1; p[2].y = p[3].y = y2; p[3].x = x3; XDrawLines(fl_display, fl_window, fl_gc, p, 4, 0);#endif#endif}void fl_yxline(int x, int y, int y1) {#ifdef WIN32 if (y1 < y) y1--; else y1++; MoveToEx(fl_gc, x, y, 0L); LineTo(fl_gc, x, y1);#else#ifdef NANO_X GrLine(fl_window,fl_gc,x,y,x,y1);#else XDrawLine(fl_display, fl_window, fl_gc, x, y, x, y1);#endif#endif}void fl_yxline(int x, int y, int y1, int x2) {#ifdef WIN32 if (x2 > x) x2++; else x2--; MoveToEx(fl_gc, x, y, 0L); LineTo(fl_gc, x, y1); LineTo(fl_gc, x2, y1);#else#ifdef NANO_X GR_POINT p[3]; p[0].x = p[1].x = x; p[0].y = y; p[1].y = p[2].y = y1; p[2].x = x2; GrPoly(fl_window,fl_gc,3,p);#else XPoint p[3]; p[0].x = p[1].x = x; p[0].y = y; p[1].y = p[2].y = y1; p[2].x = x2; XDrawLines(fl_display, fl_window, fl_gc, p, 3, 0);#endif#endif}void fl_yxline(int x, int y, int y1, int x2, int y3) {#ifdef WIN32 if(y3<y1) y3--; else y3++; MoveToEx(fl_gc, x, y, 0L); LineTo(fl_gc, x, y1); LineTo(fl_gc, x2, y1); LineTo(fl_gc, x2, y3);#else#ifdef NANO_X GR_POINT p[4]; p[0].x = p[1].x = x; p[0].y = y; p[1].y = p[2].y = y1; p[2].x = p[3].x = x2; p[3].y = y3; GrPoly(fl_window,fl_gc,4,p);#else XPoint p[4]; p[0].x = p[1].x = x; p[0].y = y; p[1].y = p[2].y = y1; p[2].x = p[3].x = x2; p[3].y = y3; XDrawLines(fl_display, fl_window, fl_gc, p, 4, 0);#endif#endif}void fl_line(int x, int y, int x1, int y1) {#ifdef WIN32 MoveToEx(fl_gc, x, y, 0L); LineTo(fl_gc, x1, y1); // Draw the last point *again* because the GDI line drawing // functions will not draw the last point ("it's a feature!"...) SetPixel(fl_gc, x1, y1, fl_RGB());#else#ifdef NANO_X GrLine(fl_window,fl_gc,x,y,x1,y1);#else XDrawLine(fl_display, fl_window, fl_gc, x, y, x1, y1);#endif#endif}void fl_line(int x, int y, int x1, int y1, int x2, int y2) {#ifdef WIN32 MoveToEx(fl_gc, x, y, 0L); LineTo(fl_gc, x1, y1); LineTo(fl_gc, x2, y2); // Draw the last point *again* because the GDI line drawing // functions will not draw the last point ("it's a feature!"...) SetPixel(fl_gc, x2, y2, fl_RGB());#else#ifdef NANO_X GR_POINT p[3]; p[0].x = x; p[0].y = y; p[1].x = x1; p[1].y = y1; p[2].x = x2; p[2].y = y2; GrPoly(fl_window,fl_gc,3,p);#else XPoint p[3]; p[0].x = x; p[0].y = y; p[1].x = x1; p[1].y = y1; p[2].x = x2; p[2].y = y2; XDrawLines(fl_display, fl_window, fl_gc, p, 3, 0);#endif#endif}void fl_loop(int x, int y, int x1, int y1, int x2, int y2) {#ifdef WIN32 MoveToEx(fl_gc, x, y, 0L); LineTo(fl_gc, x1, y1); LineTo(fl_gc, x2, y2); LineTo(fl_gc, x, y);#else#ifdef NANO_X GR_POINT p[4]; p[0].x = x; p[0].y = y; p[1].x = x1; p[1].y = y1; p[2].x = x2; p[2].y = y2; p[3].x = x; p[3].y = y; GrPoly(fl_window,fl_gc,4,p);#else XPoint p[4]; p[0].x = x; p[0].y = y; p[1].x = x1; p[1].y = y1; p[2].x = x2; p[2].y = y2; p[3].x = x; p[3].y = y; XDrawLines(fl_display, fl_window, fl_gc, p, 4, 0);#endif#endif}void fl_loop(int x, int y, int x1, int y1, int x2, int y2, int x3, int y3) {#ifdef WIN32 MoveToEx(fl_gc, x, y, 0L); LineTo(fl_gc, x1, y1); LineTo(fl_gc, x2, y2); LineTo(fl_gc, x3, y3); LineTo(fl_gc, x, y);#else#ifdef NANO_X GR_POINT p[5]; p[0].x = x; p[0].y = y; p[1].x = x1; p[1].y = y1; p[2].x = x2; p[2].y = y2; p[3].x = x3; p[3].y = y3; p[4].x = x; p[4].y = y; GrPoly(fl_window,fl_gc,5,p);#else XPoint p[5]; p[0].x = x; p[0].y = y; p[1].x = x1; p[1].y = y1; p[2].x = x2; p[2].y = y2; p[3].x = x3; p[3].y = y3; p[4].x = x; p[4].y = y; XDrawLines(fl_display, fl_window, fl_gc, p, 5, 0);#endif#endif}void fl_polygon(int x, int y, int x1, int y1, int x2, int y2) {#ifdef NANO_X GR_POINT p[4];#else XPoint p[4];#endif p[0].x = x; p[0].y = y; p[1].x = x1; p[1].y = y1; p[2].x = x2; p[2].y = y2;#ifdef WIN32 SelectObject(fl_gc, fl_brush()); Polygon(fl_gc, p, 3);#else p[3].x = x; p[3].y = y;#ifdef NANO_X GrFillPoly(fl_window,fl_gc,4,p);#else XFillPolygon(fl_display, fl_window, fl_gc, p, 3, Convex, 0); XDrawLines(fl_display, fl_window, fl_gc, p, 4, 0);#endif#endif}void fl_polygon(int x, int y, int x1, int y1, int x2, int y2, int x3, int y3) {#ifdef NANO_X GR_POINT p[5];#else XPoint p[5];#endif p[0].x = x; p[0].y = y; p[1].x = x1; p[1].y = y1; p[2].x = x2; p[2].y = y2; p[3].x = x3; p[3].y = y3;#ifdef WIN32 SelectObject(fl_gc, fl_brush()); Polygon(fl_gc, p, 4);#else p[4].x = x; p[4].y = y;#ifdef NANO_X GrFillPoly(fl_window,fl_gc,5,p);#else XFillPolygon(fl_display, fl_window, fl_gc, p, 4, Convex, 0); XDrawLines(fl_display, fl_window, fl_gc, p, 5, 0);#endif#endif}void fl_point(int x, int y) {#ifdef WIN32 SetPixel(fl_gc, x, y, fl_RGB());#else#ifdef NANO_X GrPoint(fl_window,fl_gc,x,y);#else XDrawPoint(fl_display, fl_window, fl_gc, x, y);#endif#endif}////////////////////////////////////////////////////////////////#define STACK_SIZE 10#define STACK_MAX (STACK_SIZE - 1)static Region rstack[STACK_SIZE];static int rstackptr=0;int fl_clip_state_number=0; // used by gl_begin.C to update GL clip#ifndef WIN32// Missing X call: (is this the fastest way to init a 1-rectangle region?)// MSWindows equivalent exists, implemented inline in win32.HRegion XRectangleRegion(int x, int y, int w, int h) {#ifdef NANO_X GR_RECT R; R.x = x; R.y = y; R.width = w; R.height = h; GR_REGION_ID r = GrNewRegion(); GrUnionRectWithRegion(r, &R); return r;#else XRectangle R; R.x = x; R.y = y; R.width = w; R.height = h; Region r = XCreateRegion(); XUnionRectWithRegion(&R, r, r); return r;#endif}#endif// undo any clobbering of clip done by your program:void fl_restore_clip() { fl_clip_state_number++; Region r = rstack[rstackptr];#ifdef WIN32 SelectClipRgn(fl_gc, r); //if r is NULL, clip is automatically cleared#else#ifdef NANO_X GrSetGCRegion(fl_gc, r); // if r is 0, clip is cleared#else if (r) XSetRegion(fl_display, fl_gc, r); else XSetClipMask(fl_display, fl_gc, 0);#endif#endif}// Replace the top of the clip stack:void fl_clip_region(Region r) { Region oldr = rstack[rstackptr];#ifdef NANO_X if (oldr) GrDestroyRegion(oldr);#else if (oldr) XDestroyRegion(oldr);#endif rstack[rstackptr] = r; fl_restore_clip();}// Intersect & push a new clip rectangle:void fl_clip(int x, int y, int w, int h) { Region r; if (w > 0 && h > 0) { r = XRectangleRegion(x,y,w,h); Region current = rstack[rstackptr]; if (current) {#ifndef WIN32#ifdef NANO_X Region temp = GrNewRegion(); GrIntersectRegion(temp, current, r); GrDestroyRegion(r);#else Region temp = XCreateRegion(); XIntersectRegion(current, r, temp); XDestroyRegion(r);#endif r = temp;#else CombineRgn(r,r,current,RGN_AND);#endif } } else { // make empty clip region:#ifndef WIN32#ifdef NANO_X r = GrNewRegion();#else r = XCreateRegion();#endif#else r = CreateRectRgn(0,0,0,0);#endif } if (rstackptr < STACK_MAX) rstack[++rstackptr] = r; fl_restore_clip();}// make there be no clip (used by fl_begin_offscreen() only!)void fl_push_no_clip() { if (rstackptr < STACK_MAX) rstack[++rstackptr] = 0; fl_restore_clip();}// pop back to previous clip:void fl_pop_clip() { if (rstackptr > 0) { Region oldr = rstack[rstackptr--];#ifdef NANO_X if (oldr) GrDestroyRegion(oldr);#else if (oldr) XDestroyRegion(oldr);#endif } fl_restore_clip();}// does this rectangle intersect current clip?int fl_not_clipped(int x, int y, int w, int h) { Region r = rstack[rstackptr];#ifndef WIN32#ifdef NANO_X return r ? GrRectInRegion(r, x, y, w, h) : 1;#else return r ? XRectInRegion(r, x, y, w, h) : 1;#endif#else if (!r) return 1; RECT rect; rect.left = x; rect.top = y; rect.right = x+w; rect.bottom = y+h; return RectInRegion(r,&rect);#endif}// return rectangle surrounding intersection of this rectangle and clip:int fl_clip_box(int x, int y, int w, int h, int& X, int& Y, int& W, int& H){ X = x; Y = y; W = w; H = h; Region r = rstack[rstackptr]; if (!r) return 0;#ifndef WIN32#ifdef NANO_X { switch (GrRectInRegion(r, x, y, w, h)) { case MWRECT_OUT: // completely outside W = H = 0; return 2; case MWRECT_ALLIN: // completely inside return 0; default: // partial: break; } Region rr = XRectangleRegion(x,y,w,h); Region temp = GrNewRegion(); GrIntersectRegion(temp, r, rr); GR_RECT rect; GrGetRegionBox(temp, &rect); X = rect.x; Y = rect.y; W = rect.width; H = rect.height; GrDestroyRegion(temp); GrDestroyRegion(rr); return 1; }#else switch (XRectInRegion(r, x, y, w, h)) { case 0: // completely outside W = H = 0; return 2; case 1: // completely inside: return 0; default: // partial: break; } Region rr = XRectangleRegion(x,y,w,h); Region temp = XCreateRegion(); XIntersectRegion(r, rr, temp); XRectangle rect; XClipBox(temp, &rect); X = rect.x; Y = rect.y; W = rect.width; H = rect.height; XDestroyRegion(temp); XDestroyRegion(rr); return 1;#endif#else// The win32 API makes no distinction between partial and complete// intersection, so we have to check for partial intersection ourselves.// However, given that the regions may be composite, we have to do// some voodoo stuff... Region rr = XRectangleRegion(x,y,w,h); Region temp = CreateRectRgn(0,0,0,0); int ret; if (CombineRgn(temp, rr, r, RGN_AND) == NULLREGION) { // disjoint W = H = 0; ret = 2; } else if (EqualRgn(temp, rr)) { // complete ret = 0; } else { // parital intersection RECT rect; GetRgnBox(temp, &rect); X = rect.left; Y = rect.top; W = rect.right - X; H = rect.bottom - Y; ret = 1; } DeleteObject(temp); DeleteObject(rr); return ret;#endif}//// End of "$Id: fl_rect.cxx,v 1.1.1.1 2003/08/07 21:18:41 jasonk Exp $".//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -