xgc.c
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:13k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* 
  2.  * xgc.c --
  3.  *
  4.  * This file contains generic routines for manipulating X graphics
  5.  * contexts. 
  6.  *
  7.  * Copyright (c) 1995-1996 Sun Microsystems, Inc.
  8.  * Copyright (c) 2002-2007 Daniel A. Steffen <das@users.sourceforge.net>
  9.  *
  10.  * See the file "license.terms" for information on usage and redistribution
  11.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  12.  *
  13.  * RCS: @(#) $Id: xgc.c,v 1.6.2.6 2007/11/09 06:26:57 das Exp $
  14.  */
  15. #include <tkInt.h>
  16. #if !defined(MAC_TCL) && !defined(MAC_OSX_TK)
  17. # include <X11/Xlib.h>
  18. #endif
  19. #ifdef MAC_TCL
  20. # include <Xlib.h>
  21. # include <X.h>
  22. # define Cursor XCursor
  23. # define Region XRegion
  24. #endif
  25. #ifdef MAC_OSX_TK
  26. # include <tkMacOSXInt.h>
  27. # include <X11/Xlib.h>
  28. # include <X11/X.h>
  29. # define Cursor XCursor
  30. # define Region XRegion
  31. #endif
  32. /*
  33.  *----------------------------------------------------------------------
  34.  *
  35.  * AllocClipMask --
  36.  *
  37.  * Static helper proc to allocate new or clear existing TkpClipMask.
  38.  *
  39.  * Results:
  40.  * Returns ptr to the new/cleared TkpClipMask.
  41.  *
  42.  * Side effects:
  43.  * None.
  44.  *
  45.  *----------------------------------------------------------------------
  46.  */
  47. static TkpClipMask *AllocClipMask(GC gc) {
  48.     TkpClipMask *clip_mask = (TkpClipMask*) gc->clip_mask;
  49.     
  50.     if (clip_mask == None) {
  51. clip_mask = (TkpClipMask*) ckalloc(sizeof(TkpClipMask));
  52. gc->clip_mask = (Pixmap) clip_mask;
  53. #ifdef MAC_OSX_TK
  54.     } else if (clip_mask->type == TKP_CLIP_REGION) {
  55. TkpReleaseRegion(clip_mask->value.region);
  56. #endif
  57.     }
  58.     return clip_mask;
  59. }
  60. /*
  61.  *----------------------------------------------------------------------
  62.  *
  63.  * FreeClipMask --
  64.  *
  65.  * Static helper proc to free TkpClipMask.
  66.  *
  67.  * Results:
  68.  * None.
  69.  *
  70.  * Side effects:
  71.  * None.
  72.  *
  73.  *----------------------------------------------------------------------
  74.  */
  75. static void FreeClipMask(GC gc) {
  76.     if (gc->clip_mask != None) {
  77. #ifdef MAC_OSX_TK
  78. if (((TkpClipMask*) gc->clip_mask)->type == TKP_CLIP_REGION) {
  79.     TkpReleaseRegion(((TkpClipMask*) gc->clip_mask)->value.region);
  80. }
  81. #endif
  82. ckfree((char*) gc->clip_mask);
  83. gc->clip_mask = None;
  84.     }
  85. }
  86. /*
  87.  *----------------------------------------------------------------------
  88.  *
  89.  * XCreateGC --
  90.  *
  91.  * Allocate a new GC, and initialize the specified fields.
  92.  *
  93.  * Results:
  94.  * Returns a newly allocated GC. 
  95.  *
  96.  * Side effects:
  97.  * None.
  98.  *
  99.  *----------------------------------------------------------------------
  100.  */
  101. GC
  102. XCreateGC(display, d, mask, values)
  103.     Display* display;
  104.     Drawable d;
  105.     unsigned long mask;
  106.     XGCValues* values;
  107. {
  108.     GC gp;
  109. /*
  110.  * In order to have room for a dash list, MAX_DASH_LIST_SIZE extra chars are
  111.  * defined, which is invisible from the outside. The list is assumed to end
  112.  * with a 0-char, so this must be set explicitely during initialization.
  113.  */
  114. #define MAX_DASH_LIST_SIZE 10
  115.     gp = (XGCValues *)ckalloc(sizeof(XGCValues) + MAX_DASH_LIST_SIZE);
  116.     if (!gp) {
  117. return None;
  118.     }
  119.     gp->function =  (mask & GCFunction)  ?values->function :GXcopy;
  120.     gp->plane_mask =  (mask & GCPlaneMask)  ?values->plane_mask  :~0;
  121.     gp->foreground =  (mask & GCForeground)  ?values->foreground  :
  122.     BlackPixelOfScreen(DefaultScreenOfDisplay(display));
  123.     gp->background =  (mask & GCBackground)  ?values->background  :
  124.     WhitePixelOfScreen(DefaultScreenOfDisplay(display));
  125.     gp->line_width =  (mask & GCLineWidth) ?values->line_width :1;
  126.     gp->line_style =  (mask & GCLineStyle) ?values->line_style :LineSolid;
  127.     gp->cap_style =   (mask & GCCapStyle) ?values->cap_style :0;
  128.     gp->join_style =  (mask & GCJoinStyle) ?values->join_style :0;
  129.     gp->fill_style =   (mask & GCFillStyle) ?values->fill_style :FillSolid;
  130.     gp->fill_rule =   (mask & GCFillRule) ?values->fill_rule :WindingRule;
  131.     gp->arc_mode =  (mask & GCArcMode) ?values->arc_mode :ArcPieSlice;
  132.     gp->tile =  (mask & GCTile) ?values->tile :None;
  133.     gp->stipple =  (mask & GCStipple) ?values->stipple :None;
  134.     gp->ts_x_origin =  (mask & GCTileStipXOrigin) ?values->ts_x_origin:0;
  135.     gp->ts_y_origin =  (mask & GCTileStipYOrigin) ?values->ts_y_origin:0;
  136.     gp->font =  (mask & GCFont) ?values->font :None;
  137.     gp->subwindow_mode = (mask & GCSubwindowMode)?values->subwindow_mode:ClipByChildren;
  138.     gp->graphics_exposures = (mask & GCGraphicsExposures)?values->graphics_exposures:True;
  139.     gp->clip_x_origin = (mask & GCClipXOrigin) ?values->clip_x_origin :0;
  140.     gp->clip_y_origin = (mask & GCClipYOrigin) ?values->clip_y_origin :0;
  141.     gp->dash_offset =  (mask & GCDashOffset) ?values->dash_offset :0;
  142.     gp->dashes =  (mask & GCDashList) ?values->dashes :4;
  143.     (&(gp->dashes))[1] =  0;
  144.     gp->clip_mask = None;
  145.     if (mask & GCClipMask) {
  146. TkpClipMask *clip_mask = AllocClipMask(gp);
  147. clip_mask->type = TKP_CLIP_PIXMAP;
  148. clip_mask->value.pixmap = values->clip_mask;
  149.     }
  150.     return gp;
  151. }
  152. /*
  153.  *----------------------------------------------------------------------
  154.  *
  155.  * XChangeGC --
  156.  *
  157.  * Changes the GC components specified by valuemask for the
  158.  * specified GC.
  159.  *
  160.  * Results:
  161.  * None.
  162.  *
  163.  * Side effects:
  164.  * Updates the specified GC.
  165.  *
  166.  *----------------------------------------------------------------------
  167.  */
  168. void
  169. XChangeGC(d, gc, mask, values)
  170.     Display * d;
  171.     GC gc;
  172.     unsigned long mask;
  173.     XGCValues *values;
  174. {
  175.     if (mask & GCFunction) { gc->function = values->function; }
  176.     if (mask & GCPlaneMask) { gc->plane_mask = values->plane_mask; }
  177.     if (mask & GCForeground) { gc->foreground = values->foreground; }
  178.     if (mask & GCBackground) { gc->background = values->background; }
  179.     if (mask & GCLineWidth) { gc->line_width = values->line_width; }
  180.     if (mask & GCLineStyle) { gc->line_style = values->line_style; }
  181.     if (mask & GCCapStyle) { gc->cap_style = values->cap_style; }
  182.     if (mask & GCJoinStyle) { gc->join_style = values->join_style; }
  183.     if (mask & GCFillStyle) { gc->fill_style = values->fill_style; }
  184.     if (mask & GCFillRule) { gc->fill_rule = values->fill_rule; }
  185.     if (mask & GCArcMode) { gc->arc_mode = values->arc_mode; }
  186.     if (mask & GCTile) { gc->tile = values->tile; }
  187.     if (mask & GCStipple) { gc->stipple = values->stipple; }
  188.     if (mask & GCTileStipXOrigin) { gc->ts_x_origin = values->ts_x_origin; }
  189.     if (mask & GCTileStipYOrigin) { gc->ts_y_origin = values->ts_y_origin; }
  190.     if (mask & GCFont) { gc->font = values->font; }
  191.     if (mask & GCSubwindowMode) { gc->subwindow_mode = values->subwindow_mode; }
  192.     if (mask & GCGraphicsExposures) { gc->graphics_exposures = values->graphics_exposures; }
  193.     if (mask & GCClipXOrigin) { gc->clip_x_origin = values->clip_x_origin; }
  194.     if (mask & GCClipYOrigin) { gc->clip_y_origin = values->clip_y_origin; }
  195.     if (mask & GCClipMask) { XSetClipMask(d, gc, values->clip_mask); }
  196.     if (mask & GCDashOffset) { gc->dash_offset = values->dash_offset; }
  197.     if (mask & GCDashList) { gc->dashes = values->dashes; (&(gc->dashes))[1] = 0;}
  198. }
  199. /*
  200.  *----------------------------------------------------------------------
  201.  *
  202.  * XFreeGC --
  203.  *
  204.  * Deallocates the specified graphics context.
  205.  *
  206.  * Results:
  207.  * None.
  208.  *
  209.  * Side effects:
  210.  * None.
  211.  *
  212.  *----------------------------------------------------------------------
  213.  */
  214. void XFreeGC(d, gc)
  215.     Display * d;
  216.     GC gc;
  217. {
  218.     if (gc != None) {
  219. FreeClipMask(gc);
  220. ckfree((char *) gc);
  221.     }
  222. }
  223. /*
  224.  *----------------------------------------------------------------------
  225.  *
  226.  * XSetForeground, etc. --
  227.  *
  228.  * The following functions are simply accessor functions for
  229.  * the GC slots.
  230.  *
  231.  * Results:
  232.  * None.
  233.  *
  234.  * Side effects:
  235.  * Each function sets some slot in the GC.
  236.  *
  237.  *----------------------------------------------------------------------
  238.  */
  239. void 
  240. XSetForeground(display, gc, foreground)
  241.     Display *display;
  242.     GC gc;
  243.     unsigned long foreground;
  244. {
  245.     gc->foreground = foreground;
  246. }
  247. void 
  248. XSetBackground(display, gc, background)
  249.     Display *display;
  250.     GC gc;
  251.     unsigned long background;
  252. {
  253.     gc->background = background;
  254. }
  255. void
  256. XSetDashes(display, gc, dash_offset, dash_list, n)
  257.     Display* display;
  258.     GC gc;
  259.     int dash_offset;
  260.     _Xconst char* dash_list;
  261.     int n;
  262. {
  263.     char *p = &(gc->dashes);
  264. #ifdef TkWinDeleteBrush
  265.     TkWinDeleteBrush(gc->fgBrush);
  266.     TkWinDeletePen(gc->fgPen);
  267.     TkWinDeleteBrush(gc->bgBrush);
  268.     TkWinDeletePen(gc->fgExtPen);
  269. #endif
  270.     gc->dash_offset = dash_offset;
  271.     if (n > MAX_DASH_LIST_SIZE) n = MAX_DASH_LIST_SIZE;
  272.     while (n-- > 0) {
  273. *p++ = *dash_list++;
  274.     }
  275.     *p = 0;
  276. }
  277. void
  278. XSetFunction(display, gc, function)
  279.     Display *display;
  280.     GC gc;
  281.     int function;
  282. {
  283.     gc->function = function;
  284. }
  285. void
  286. XSetFillRule(display, gc, fill_rule)
  287.     Display *display;
  288.     GC gc;
  289.     int fill_rule;
  290. {
  291.     gc->fill_rule = fill_rule;
  292. }
  293. void
  294. XSetFillStyle(display, gc, fill_style)
  295.     Display *display;
  296.     GC gc;
  297.     int fill_style;
  298. {
  299.     gc->fill_style = fill_style;
  300. }
  301. void
  302. XSetTSOrigin(display, gc, x, y)
  303.     Display *display;
  304.     GC gc;
  305.     int x, y;
  306. {
  307.     gc->ts_x_origin = x;
  308.     gc->ts_y_origin = y;
  309. }
  310. void
  311. XSetFont(display, gc, font)
  312.     Display *display;
  313.     GC gc;
  314.     Font font;
  315. {
  316.     gc->font = font;
  317. }
  318. void
  319. XSetArcMode(display, gc, arc_mode)
  320.     Display *display;
  321.     GC gc;
  322.     int arc_mode;
  323. {
  324.     gc->arc_mode = arc_mode;
  325. }
  326. void
  327. XSetStipple(display, gc, stipple)
  328.     Display *display;
  329.     GC gc;
  330.     Pixmap stipple;
  331. {
  332.     gc->stipple = stipple;
  333. }
  334. void
  335. XSetLineAttributes(display, gc, line_width, line_style, cap_style,
  336. join_style)
  337.     Display *display;
  338.     GC gc;
  339.     unsigned int line_width;
  340.     int line_style;
  341.     int cap_style;
  342.     int join_style;
  343. {
  344.     gc->line_width = line_width;
  345.     gc->line_style = line_style;
  346.     gc->cap_style = cap_style;
  347.     gc->join_style = join_style;
  348. }
  349. void
  350. XSetClipOrigin(display, gc, clip_x_origin, clip_y_origin)
  351.     Display* display;
  352.     GC gc;
  353.     int clip_x_origin;
  354.     int clip_y_origin;
  355. {
  356.     gc->clip_x_origin = clip_x_origin;
  357.     gc->clip_y_origin = clip_y_origin;
  358. }
  359. /*
  360.  *----------------------------------------------------------------------
  361.  *
  362.  * TkSetRegion, XSetClipMask --
  363.  *
  364.  * Sets the clipping region/pixmap for a GC.
  365.  *
  366.  * Note that unlike the Xlib equivalent, it is not safe to delete the
  367.  * region after setting it into the GC (except on Mac OS X). The only
  368.  * uses of TkSetRegion are currently in DisplayFrame and in
  369.  * ImgPhotoDisplay, which use the GC immediately.
  370.  *
  371.  * Results:
  372.  * None.
  373.  *
  374.  * Side effects:
  375.  * Allocates or dealloates a TkpClipMask.
  376.  *
  377.  *----------------------------------------------------------------------
  378.  */
  379. void
  380. TkSetRegion(display, gc, r)
  381.     Display* display;
  382.     GC gc;
  383.     TkRegion r;
  384. {
  385.     if (r == None) {
  386. FreeClipMask(gc);
  387.     } else {
  388. TkpClipMask *clip_mask = AllocClipMask(gc);
  389. clip_mask->type = TKP_CLIP_REGION;
  390. clip_mask->value.region = r;
  391. #ifdef MAC_OSX_TK
  392. TkpRetainRegion(r);
  393. #endif
  394.     }
  395. }
  396. void
  397. XSetClipMask(display, gc, pixmap)
  398.     Display* display;
  399.     GC gc;
  400.     Pixmap pixmap;
  401. {
  402.     if (pixmap == None) {
  403. FreeClipMask(gc);
  404.     } else {
  405. TkpClipMask *clip_mask = AllocClipMask(gc);
  406. clip_mask->type = TKP_CLIP_PIXMAP;
  407. clip_mask->value.pixmap = pixmap;
  408.     }
  409. }
  410. /*
  411.  * Some additional dummy functions (hopefully implemented soon).
  412.  */
  413. #if 0
  414. Cursor
  415. XCreateFontCursor(display, shape)
  416.     Display* display;
  417.     unsigned int shape;
  418. {
  419.     return (Cursor) 0;
  420. }
  421. void
  422. XDrawImageString(display, d, gc, x, y, string, length)
  423.     Display* display;
  424.     Drawable d;
  425.     GC gc;
  426.     int x;
  427.     int y;
  428.     _Xconst char* string;
  429.     int length;
  430. {
  431. }
  432. #endif
  433. void
  434. XDrawPoint(display, d, gc, x, y)
  435.     Display* display;
  436.     Drawable d;
  437.     GC gc;
  438.     int x;
  439.     int y;
  440. {
  441.     XDrawLine(display, d, gc, x, y, x, y);
  442. }
  443. void
  444. XDrawPoints(display, d, gc, points, npoints, mode)
  445.     Display* display;
  446.     Drawable d;
  447.     GC gc;
  448.     XPoint* points;
  449.     int npoints;
  450.     int mode;
  451. {
  452.     int i;
  453.     for (i=0; i<npoints; i++) {
  454. XDrawPoint(display, d, gc, points[i].x, points[i].y);
  455.     }
  456. }
  457. #if !defined(MAC_TCL) && !defined(MAC_OSX_TK)
  458. void
  459. XDrawSegments(display, d, gc, segments, nsegments)
  460.     Display* display;
  461.     Drawable d;
  462.     GC gc;
  463.     XSegment* segments;
  464.     int nsegments;
  465. {
  466. }
  467. #endif
  468. #if 0
  469. char *
  470. XFetchBuffer(display, nbytes_return, buffer)
  471.     Display* display;
  472.     int* nbytes_return;
  473.     int buffer;
  474. {
  475.     return (char *) 0;
  476. }
  477. Status XFetchName(display, w, window_name_return)
  478.     Display* display;
  479.     Window w;
  480.     char** window_name_return;
  481. {
  482.     return (Status) 0;
  483. }
  484. Atom *XListProperties(display, w, num_prop_return)
  485.     Display* display;
  486.     Window w;
  487.     int* num_prop_return;
  488. {
  489.     return (Atom *) 0;
  490. }
  491. void
  492. XMapRaised(display, w)
  493.     Display* display;
  494.     Window w;
  495. {
  496. }
  497. void
  498. XPutImage(display, d, gc, image, src_x, src_y, dest_x, dest_y, width, height)
  499.     Display* display;
  500.     Drawable d;
  501.     GC gc;
  502.     XImage* image;
  503.     int src_x;
  504.     int src_y;
  505.     int dest_x;
  506.     int dest_y;
  507.     unsigned int width;
  508.     unsigned int height;
  509. {
  510. }
  511. void
  512. XQueryTextExtents(display, font_ID, string, nchars, direction_return,
  513. font_ascent_return, font_descent_return, overall_return)
  514.     Display* display;
  515.     XID font_ID;
  516.     _Xconst char* string;
  517.     int nchars;
  518.     int* direction_return;
  519.     int* font_ascent_return;
  520.     int* font_descent_return;
  521.     XCharStruct* overall_return;
  522. {
  523. }
  524. void
  525. XReparentWindow(display, w, parent, x, y)
  526.     Display* display;
  527.     Window w;
  528.     Window parent;
  529.     int x;
  530.     int y;
  531. {
  532. }
  533. void
  534. XRotateBuffers(display, rotate)
  535.     Display* display;
  536.     int rotate;
  537. {
  538. }
  539. void
  540. XStoreBuffer(display, bytes, nbytes, buffer)
  541.     Display* display;
  542.     _Xconst char* bytes;
  543.     int nbytes;
  544.     int buffer;
  545. {
  546. }
  547. void
  548. XUndefineCursor(display, w)
  549.     Display* display;
  550.     Window w;
  551. {
  552. }
  553. #endif