home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / evbl0627.zip / everblue_20010627.zip / x11 / Xlib_DrawPoly.c < prev    next >
C/C++ Source or Header  |  2001-01-29  |  7KB  |  191 lines

  1.  
  2. #include <alloca.h>
  3. #include "Xlib_private.h"
  4.  
  5. int XFillPolygon(Display* display, Drawable d, GC gc, XPoint* points, int npoints, int shape, int mode)
  6. {
  7.     DBUG_ENTER("XFillPolygon")
  8.     HPS hps;
  9.     POLYGON poly;
  10.     Xlib_GC *xgc = (Xlib_GC *)gc;
  11.     int viewheight = GetDrawableHeight(d, gc, &hps, GC_NOPATH);
  12.     int i;
  13.     if (!viewheight || !points || ((poly.ulPoints = npoints)<2) || 
  14.         !(poly.aPointl = alloca(sizeof(POINTL) * npoints))) DBUG_RETURN(False);
  15.     Xlib_SetGC(hps, xgc);
  16.     for (i=0; i<npoints; i++) {
  17.         poly.aPointl[i].x = points[i].x;
  18.                 poly.aPointl[i].y = viewheight - points[i].y;
  19.         }
  20.     GpiMove(hps, &poly.aPointl[npoints-1]);
  21.     viewheight = GetDrawableHeight(d, gc, &hps, GC_AREAFILL);
  22.         GpiPolyLine(hps, poly.ulPoints, poly.aPointl);
  23.         XFlushGC(display, gc);
  24.     DBUG_RETURN(True);
  25. }
  26.  
  27. int XFillArc(Display* display, Drawable d, GC gc, int x, int y,
  28.          unsigned int width, unsigned int height, int angle1, int angle2)
  29. {
  30.     DBUG_ENTER("XFillArc")
  31.     HPS hps;
  32.     POINTL lPtCenter, lStartPt, lEndPt;
  33.     ARCPARAMS arcparms;
  34.     FIXED fxStartAngle, fxSweepAngle;
  35.     Xlib_GC *xgc = (Xlib_GC *)gc;
  36.     int reverse = 0;
  37.     int viewheight = GetDrawableHeight(d, gc, &hps, GC_NOPATH);
  38.     if (!viewheight) DBUG_RETURN(False);
  39.     Xlib_SetGC(hps, xgc);
  40.     arcparms.lR = arcparms.lS = 0L;
  41.     lPtCenter.x = x + (arcparms.lP = width / 2L);
  42.     lPtCenter.y = viewheight - y - (arcparms.lQ = height / 2L) - 1;
  43.     if (angle2 < 0) {
  44.         angle1 -= (angle2 = -angle2);
  45.         reverse = 1;
  46.     };    
  47.     while (angle1 < 0) angle1 += 23040;
  48.     /*fxStartAngle = MAKEFIXED(angle1 / 64,(angle1 % 64)<<10);
  49.      *fxSweepAngle = MAKEFIXED(angle2 / 64,(angle2 % 64)<<10);*/
  50.     fxStartAngle = MAKEFIXED(angle1,0)/64;
  51.     fxSweepAngle = MAKEFIXED(angle2,0)/64;
  52.     GpiSetLineType(hps, LINETYPE_INVISIBLE);
  53.     GpiMove(hps, &lPtCenter);
  54.     GpiSetArcParams(hps, (PARCPARAMS)&arcparms);
  55.     GpiPartialArc(hps, &lPtCenter, MAKEFIXED(1,0), fxStartAngle, MAKEFIXED(0,0));
  56.     GpiQueryCurrentPosition(hps, (PPOINTL)&lStartPt);
  57.     GpiSetLineType(hps, LineStyletoLineType[((Xlib_GC *)gc)->values.line_style]);
  58.     viewheight = GetDrawableHeight(d, gc, &hps, GC_AREAFILL);
  59.     GpiPartialArc(hps, &lPtCenter, MAKEFIXED(1,0), fxStartAngle, fxSweepAngle);
  60.     GpiQueryCurrentPosition(hps, (PPOINTL)&lEndPt);
  61.     if (((Xlib_GC *)gc)->values.arc_mode == ArcPieSlice)
  62.         GpiLine(hps, &lPtCenter);
  63.     GpiLine(hps, &lStartPt);
  64.     XFlushGC(display, gc);
  65.     if (reverse)
  66.     GpiMove(hps, (PPOINTL)&lStartPt);
  67.     GpiMove(hps, (PPOINTL)&lEndPt);
  68.     DBUG_RETURN(False);
  69. }
  70.  
  71. int XFillArcs(Display* display, Drawable d, GC gc, XArc* arcs, int narcs)
  72. {
  73.     DBUG_ENTER("XFillArcs")
  74.     HPS hps;
  75.     POINTL lPtCenter, lStartPt;
  76.     ARCPARAMS arcparms;
  77.     FIXED fxStartAngle, fxSweepAngle;
  78.     Xlib_GC *xgc = (Xlib_GC *)gc;
  79.     int reverse = 0;
  80.     int viewheight = GetDrawableHeight(d, gc, &hps, GC_NOPATH);
  81.     if (!viewheight || !narcs || !arcs) DBUG_RETURN(False);
  82.     Xlib_SetGC(hps, xgc);
  83.     while (narcs--) {
  84.         int angle1 = arcs->angle1, angle2 = arcs->angle2;
  85.         arcparms.lR = arcparms.lS = 0L;
  86.         lPtCenter.x = arcs->x + (arcparms.lP = arcs->width / 2L);
  87.         lPtCenter.y = viewheight - arcs->y - (arcparms.lQ = arcs->height / 2L) - 1;
  88.         if (angle2 < 0) {
  89.             angle1 -= (angle2 = -angle2);
  90.             reverse = 1;
  91.         };    
  92.         while (angle1 < 0) angle1 += 23040;
  93.         /*fxStartAngle = MAKEFIXED(angle1 / 64,(angle1 % 64)<<10);
  94.          *fxSweepAngle = MAKEFIXED(angle2 / 64,(angle2 % 64)<<10);*/
  95.         fxStartAngle = MAKEFIXED(angle1,0)/64;
  96.         fxSweepAngle = MAKEFIXED(angle2,0)/64;
  97.         GpiSetLineType(hps, LINETYPE_INVISIBLE);
  98.         GpiMove(hps, &lPtCenter);
  99.         GpiSetArcParams(hps, (PARCPARAMS)&arcparms);
  100.         GpiPartialArc(hps, &lPtCenter, MAKEFIXED(1,0), fxStartAngle, MAKEFIXED(0,0));
  101.         GpiQueryCurrentPosition(hps, (PPOINTL)&lStartPt);
  102.         GpiSetLineType(hps, LineStyletoLineType[((Xlib_GC *)gc)->values.line_style]);
  103.         viewheight = GetDrawableHeight(d, gc, &hps, GC_AREAFILL);
  104.         GpiPartialArc(hps, &lPtCenter, MAKEFIXED(1,0), fxStartAngle, fxSweepAngle);
  105.         if (((Xlib_GC *)gc)->values.arc_mode == ArcPieSlice)
  106.             GpiLine(hps, &lPtCenter);
  107.         GpiLine(hps, &lStartPt);
  108.         XFlushGC(display, gc);
  109.         arcs++;
  110.     }
  111.     DBUG_RETURN(True);
  112. }
  113.  
  114. int XDrawArc(Display* display, Drawable d, GC gc, int x, int y,
  115.          unsigned int width, unsigned int height, int angle1, int angle2)
  116. {
  117.     DBUG_ENTER("XDrawArc")
  118.     HPS hps;
  119.     POINTL lPtCenter, lStartPt, lEndPt;
  120.     ARCPARAMS arcparms;
  121.     FIXED fxStartAngle, fxSweepAngle;
  122.     Xlib_GC *xgc = (Xlib_GC *)gc;
  123.     int reverse = 0;
  124.     int viewheight = GetDrawableHeight(d, gc, &hps, GC_STROKEPATH);
  125.     if (!viewheight) DBUG_RETURN(False);
  126.     Xlib_SetGC(hps, xgc);
  127.     arcparms.lR = arcparms.lS = 0L;
  128.     lPtCenter.x = x + (arcparms.lP = width / 2L);
  129.     lPtCenter.y = viewheight - y - (arcparms.lQ = height / 2L) - 1;
  130.     if (angle2 < 0) {
  131.         angle1 -= (angle2 = -angle2);
  132.         reverse = 1;
  133.     };    
  134.     while (angle1 < 0) angle1 += 23040;
  135.     /*fxStartAngle = MAKEFIXED(angle1 / 64,(angle1 % 64)<<10);
  136.      *fxSweepAngle = MAKEFIXED(angle2 / 64,(angle2 % 64)<<10);*/
  137.     fxStartAngle = MAKEFIXED(angle1,0)/64;
  138.     fxSweepAngle = MAKEFIXED(angle2,0)/64;
  139.     GpiSetLineType(hps, LINETYPE_INVISIBLE);
  140.     GpiMove(hps, &lPtCenter);
  141.     GpiSetArcParams(hps, (PARCPARAMS)&arcparms);
  142.     GpiPartialArc(hps, &lPtCenter, MAKEFIXED(1,0), fxStartAngle, MAKEFIXED(0,0));
  143.     GpiQueryCurrentPosition(hps, (PPOINTL)&lStartPt);
  144.     GpiSetLineType(hps, LineStyletoLineType[((Xlib_GC *)gc)->values.line_style]);
  145.     GpiPartialArc(hps, &lPtCenter, MAKEFIXED(1,0), fxStartAngle, fxSweepAngle);
  146.     GpiQueryCurrentPosition(hps, (PPOINTL)&lEndPt);
  147.     if (reverse)
  148.     GpiMove(hps, (PPOINTL)&lStartPt);
  149.     GpiMove(hps, (PPOINTL)&lEndPt);
  150.     DBUG_RETURN(True);
  151. }
  152.  
  153.  
  154. int XDrawArcs(Display* display, Drawable d, GC gc, XArc* arcs, int narcs)
  155. {
  156.     DBUG_ENTER("XDrawArcs")
  157.     HPS hps;
  158.     POINTL lPtCenter, lStartPt;
  159.     ARCPARAMS arcparms;
  160.     FIXED fxStartAngle, fxSweepAngle;
  161.     Xlib_GC *xgc = (Xlib_GC *)gc;
  162.     int reverse = 0;
  163.     int viewheight = GetDrawableHeight(d, gc, &hps, GC_STROKEPATH);
  164.     if (!viewheight || !narcs || !arcs) DBUG_RETURN(False);
  165.     Xlib_SetGC(hps, xgc);
  166.     while (narcs--) {
  167.         int angle1 = arcs->angle1, angle2 = arcs->angle2;
  168.         arcparms.lR = arcparms.lS = 0L;
  169.         lPtCenter.x = arcs->x + (arcparms.lP = arcs->width / 2L);
  170.         lPtCenter.y = viewheight - arcs->y - (arcparms.lQ = arcs->height / 2L) - 1;
  171.         if (angle2 < 0) {
  172.             angle1 -= (angle2 = -angle2);
  173.             reverse = 1;
  174.         };    
  175.         while (angle1 < 0) angle1 += 23040;
  176.         /*fxStartAngle = MAKEFIXED(angle1 / 64,(angle1 % 64)<<10);
  177.          *fxSweepAngle = MAKEFIXED(angle2 / 64,(angle2 % 64)<<10);*/
  178.         fxStartAngle = MAKEFIXED(angle1,0)/64;
  179.         fxSweepAngle = MAKEFIXED(angle2,0)/64;
  180.         GpiSetLineType(hps, LINETYPE_INVISIBLE);
  181.         GpiMove(hps, &lPtCenter);
  182.         GpiSetArcParams(hps, (PARCPARAMS)&arcparms);
  183.         GpiPartialArc(hps, &lPtCenter, MAKEFIXED(1,0), fxStartAngle, MAKEFIXED(0,0));
  184.         GpiQueryCurrentPosition(hps, (PPOINTL)&lStartPt);
  185.         GpiSetLineType(hps, LineStyletoLineType[((Xlib_GC *)gc)->values.line_style]);
  186.         GpiPartialArc(hps, &lPtCenter, MAKEFIXED(1,0), fxStartAngle, fxSweepAngle);
  187.         arcs++;
  188.     }
  189.     DBUG_RETURN(True);        
  190. }
  191.