gboolean
rcm_gray_motion_notify_event (GtkWidget      *widget,
			      GdkEventMotion *event,
			      RcmGray        *circle)
{
  gint        x, y;
  GdkGCValues values;

  values.function = GDK_INVERT;
  xor_gc = gdk_gc_new_with_values (Current.From->preview->window,
				   &values,
                                   GDK_GC_FUNCTION);

  if (circle->action_flag == DRAG_START)
    {
      GtkStyle *style = gtk_widget_get_style (circle->preview);

      gtk_widget_queue_draw (circle->preview);
      color_rotate_draw_large_circle (circle->preview->window,
                                      style->black_gc,
                                      circle->gray_sat);

      circle->action_flag = DRAGING;
    }
  else
    {
      color_rotate_draw_little_circle (widget->window, xor_gc,
                                       circle->hue, circle->satur); /* erase */
    }

  x = event->x - GRAY_CENTER - LITTLE_RADIUS;
  y = GRAY_CENTER - event->y + LITTLE_RADIUS;

  circle->hue   = angle_mod_2PI (arctg (y, x));
  circle->satur = sqrt (SQR (x) + SQR (y)) / GRAY_RADIUS;

  if (circle->satur > 1.0)
    circle->satur = 1;

  color_rotate_draw_little_circle (widget->window, xor_gc,
                                   circle->hue, circle->satur);

  gtk_spin_button_set_value (GTK_SPIN_BUTTON (circle->hue_entry),
                             circle->hue * rcm_units_factor(Current.Units));

  gtk_spin_button_set_value (GTK_SPIN_BUTTON (circle->satur_entry),
                             circle->satur);

  if (Current.RealTime)
    rcm_render_preview (Current.Bna->after);

  gdk_event_request_motions (event);

  return TRUE;
}
Exemple #2
0
/**
 * go_combo_tearoff_bg_copy
 * @combo_box:  Combo box
 *
 * Copy popup window image to the tearoff window.
 */
static void
go_combo_tearoff_bg_copy (GOComboBox *combo)
{
	GdkPixmap *pixmap;
	GdkGC *gc;
	GdkGCValues gc_values;

	GtkWidget *widget = combo->priv->popup;

	if (combo->priv->torn_off) {
		gc_values.subwindow_mode = GDK_INCLUDE_INFERIORS;
		gc = gdk_gc_new_with_values (widget->window,
					     &gc_values, GDK_GC_SUBWINDOW);

		pixmap = gdk_pixmap_new (widget->window,
					 widget->allocation.width,
					 widget->allocation.height,
					 -1);

		gdk_draw_drawable (pixmap, gc,
				 widget->window,
				 0, 0, 0, 0, -1, -1);
		g_object_unref (gc);

		gtk_widget_set_size_request (combo->priv->tearoff_window,
				      widget->allocation.width,
				      widget->allocation.height);

		gdk_window_set_back_pixmap
			(combo->priv->tearoff_window->window, pixmap, FALSE);
		g_object_unref (pixmap);
	}
}
Exemple #3
0
/* XOR a rectangle over a given character
 */
void
xor_char (GtkWidget *layout, GdkRectangle *clip_rect,
	  Paragraph *para, int offset)
{
  static GdkGC *gc;
  PangoRectangle rect;		/* GdkRectangle in 1.2 is too limited
				 */
  if (!gc)
    {
      GdkGCValues values;
      values.foreground = layout->style->white.pixel ?
	layout->style->white : layout->style->black;
      values.function = GDK_XOR;
      gc = gdk_gc_new_with_values (GTK_LAYOUT (layout)->bin_window,
				   &values,
				   GDK_GC_FOREGROUND | GDK_GC_FUNCTION);
    }

  gdk_gc_set_clip_rectangle (gc, clip_rect);

  char_bounds (para, offset, layout->allocation.width, &rect);

  rect.y -= GTK_LAYOUT (layout)->yoffset;

  if ((rect.y + rect.height >= 0) && (rect.y < layout->allocation.height))
    gdk_draw_rectangle (GTK_LAYOUT (layout)->bin_window, gc, TRUE,
			rect.x, rect.y, rect.width, rect.height);
}
static void
gdl_dock_master_xor_rect (GdlDockMaster *master)
{
    gint8         dash_list [2];
    GdkWindow    *window;
    GdkRectangle *rect;
    
    if (!master->_priv || !master->_priv->drag_request)
        return;
    
    master->_priv->rect_drawn = ~master->_priv->rect_drawn;
    
    if (master->_priv->rect_owner) {
        gdl_dock_xor_rect (master->_priv->rect_owner,
                           &master->_priv->drag_request->rect);
        return;
    }
    
    rect = &master->_priv->drag_request->rect;
    window = gdk_get_default_root_window ();

    if (!master->_priv->root_xor_gc) {
        GdkGCValues values;

        values.function = GDK_INVERT;
        values.subwindow_mode = GDK_INCLUDE_INFERIORS;
        master->_priv->root_xor_gc = gdk_gc_new_with_values (
            window, &values, GDK_GC_FUNCTION | GDK_GC_SUBWINDOW);
    };

    gdk_gc_set_line_attributes (master->_priv->root_xor_gc, 1,
                                GDK_LINE_ON_OFF_DASH,
                                GDK_CAP_NOT_LAST,
                                GDK_JOIN_BEVEL);
    
    dash_list[0] = 1;
    dash_list[1] = 1;
    gdk_gc_set_dashes (master->_priv->root_xor_gc, 1, dash_list, 2);

    gdk_draw_rectangle (window, master->_priv->root_xor_gc, 0, 
                        rect->x, rect->y,
                        rect->width, rect->height);

    gdk_gc_set_dashes (master->_priv->root_xor_gc, 0, dash_list, 2);

    gdk_draw_rectangle (window, master->_priv->root_xor_gc, 0, 
                        rect->x + 1, rect->y + 1,
                        rect->width - 2, rect->height - 2);
}
gboolean backend_gtk_init( GtkWidget *widget, unicap_format_t *format, gpointer *_data, GError **err )
{
   struct backend_data *data;
   int i;
   GdkGCValues values;
   GdkColormap *colormap;
   
   data = g_new0( struct backend_data, 1 );

   g_memmove( &data->format, format, sizeof( unicap_format_t ) );

   for( i = 0; i < NUM_BUFFERS; i++ )
   {
      data->image_data[ i ] = g_malloc0( format->size.width * format->size.height * 3 );
      g_assert( data->image_data );
   }

   data->crop_x = 0;
   data->crop_y = 0;
   data->crop_w = format->size.width;
   data->crop_h = format->size.height;
   data->output_width = format->size.width;
   data->output_height = format->size.height;
   data->pixbuf = NULL;
 
   data->widget = widget;
   data->display = GDK_DISPLAY_XDISPLAY(gtk_widget_get_display( widget ) );

   *_data = data;
   
   sem_init( &data->sema, 0, 1 );

   data->overlay_window = widget->window;

   values.foreground.red = 0;
   values.foreground.green = 0;
   values.foreground.blue = 0;

   colormap = gtk_widget_get_colormap( widget );
   gdk_rgb_find_color( colormap, &values.foreground );

   data->overlay_gc = gdk_gc_new_with_values( data->overlay_window, 
					      &values, GDK_GC_FOREGROUND );

   gdk_window_show( data->overlay_window );


   return TRUE;
}
static void
gtk_plot_canvas_ellipse_select(GtkPlotCanvas *canvas, GtkPlotCanvasChild *child, GtkAllocation area)
{
  GdkGC *xor_gc = NULL;
  GdkGCValues values;
  
  gdk_gc_get_values(GTK_WIDGET(canvas)->style->fg_gc[0], &values);
  values.function = GDK_INVERT;
  values.foreground = GTK_WIDGET(canvas)->style->white;
  values.subwindow_mode = GDK_INCLUDE_INFERIORS;
  xor_gc = gdk_gc_new_with_values(GTK_WIDGET(canvas)->window,
                                  &values,
                                  GDK_GC_FOREGROUND |
                                  GDK_GC_FUNCTION |
                                  GDK_GC_SUBWINDOW);

  gdk_draw_rectangle (GTK_WIDGET(canvas)->window,
                      xor_gc,
                      FALSE,
                      area.x, area.y,
                      area.width, area.height);
  draw_marker(canvas, xor_gc, area.x, area.y);
  draw_marker(canvas, xor_gc, area.x, area.y + area.height);
  draw_marker(canvas, xor_gc, area.x + area.width, area.y);
  draw_marker(canvas, xor_gc, area.x + area.width, area.y + area.height);
  if(area.height > DEFAULT_MARKER_SIZE * 2){
    draw_marker(canvas, xor_gc, area.x, area.y + area.height / 2);
    draw_marker(canvas, xor_gc, area.x + area.width,
                                area.y + area.height / 2);
  }
  if(area.width > DEFAULT_MARKER_SIZE * 2){
    draw_marker(canvas, xor_gc, area.x + area.width / 2, area.y);
    draw_marker(canvas, xor_gc, area.x + area.width / 2,
                                area.y + area.height);
  }

  gdk_gc_set_line_attributes(xor_gc, 1, 1, 0, 0);
  gdk_draw_arc (GTK_WIDGET(canvas)->window, xor_gc,
                FALSE,
                roundint(area.x), roundint(area.y),
                roundint(area.width), roundint(area.height), 0, 25000);

  if(xor_gc) gdk_gc_unref(xor_gc);
}
Exemple #7
0
void
gdl_dock_xor_rect (GdlDock      *dock,
                   GdkRectangle *rect)
{
    GtkWidget *widget;
    gint8      dash_list [2];

    widget = GTK_WIDGET (dock);

    if (!dock->_priv->xor_gc) {
        if (GTK_WIDGET_REALIZED (widget)) {
            GdkGCValues values;

            values.function = GDK_INVERT;
            values.subwindow_mode = GDK_INCLUDE_INFERIORS;
            dock->_priv->xor_gc = gdk_gc_new_with_values 
                (widget->window, &values, GDK_GC_FUNCTION | GDK_GC_SUBWINDOW);
        } else 
            return;
    };

    gdk_gc_set_line_attributes (dock->_priv->xor_gc, 1,
                                GDK_LINE_ON_OFF_DASH,
                                GDK_CAP_NOT_LAST,
                                GDK_JOIN_BEVEL);
    
    dash_list [0] = 1;
    dash_list [1] = 1;
    
    gdk_gc_set_dashes (dock->_priv->xor_gc, 1, dash_list, 2);

    gdk_draw_rectangle (widget->window, dock->_priv->xor_gc, 0, 
                        rect->x, rect->y,
                        rect->width, rect->height);

    gdk_gc_set_dashes (dock->_priv->xor_gc, 0, dash_list, 2);

    gdk_draw_rectangle (widget->window, dock->_priv->xor_gc, 0, 
                        rect->x + 1, rect->y + 1,
                        rect->width - 2, rect->height - 2);
}
/*--------------------------------------------------------------------------*/
static GdkGC *
get_color(unsigned short r, unsigned short g, unsigned short b)
{
  GdkGCValues values;
  GdkColor color;

  color.pixel = 0;
  color.red = r;
  color.green = g;
  color.blue = b;

  if(gdk_colormap_alloc_color(gdk_colormap_get_system(),
			      &color, FALSE, TRUE)) {
  }
  
  values.foreground = color;
  
  return gdk_gc_new_with_values(ctk_gtksim_drawing_area->window,
				&values,
				GDK_GC_FOREGROUND);
}
/**
 * go_combo_tearoff_bg_copy
 * @combo_box:  Combo box
 *
 * Copy popup window image to the tearoff window.
 */
static void
go_combo_tearoff_bg_copy (G_GNUC_UNUSED GOComboBox *combo)
{
#if 0
	/* FIXME: is this function really needed? seems things work without it */
	GdkPixmap *pixmap;
	GdkGC *gc;
	GdkGCValues gc_values;
	GtkAllocation allocation;

	GtkWidget *widget = combo->priv->popup;

	if (combo->priv->torn_off) {
		gc_values.subwindow_mode = GDK_INCLUDE_INFERIORS;
		gc = gdk_gc_new_with_values (gtk_widget_get_window (widget),
					     &gc_values, GDK_GC_SUBWINDOW);

		gtk_widget_get_allocation (widget, &allocation);
		pixmap = gdk_pixmap_new (gtk_widget_get_window (widget),
					 allocation.width,
					 allocation.height,
					 -1);

		gdk_draw_drawable (pixmap, gc,
				 gtk_widget_get_window (widget),
				 0, 0, 0, 0, -1, -1);
		g_object_unref (gc);

		gtk_widget_set_size_request (combo->priv->tearoff_window,
				      allocation.width,
				      allocation.height);

		gdk_window_set_back_pixmap
			(gtk_widget_get_window (combo->priv->tearoff_window), pixmap, FALSE);
		g_object_unref (pixmap);
	}
#endif
}
Exemple #10
0
static gpointer
gtk_gc_new (gpointer key)
{
  GtkGCKey *keyval;
  GtkGCDrawable *drawable;
  GdkGC *gc;

  keyval = key;

  drawable = g_hash_table_lookup (gc_drawable_ht, &keyval->depth);
  if (!drawable)
    {
      drawable = g_new (GtkGCDrawable, 1);
      drawable->depth = keyval->depth;
      drawable->drawable = gdk_pixmap_new (NULL, 1, 1, drawable->depth);

      g_hash_table_insert (gc_drawable_ht, &drawable->depth, drawable);
    }

  gc = gdk_gc_new_with_values (drawable->drawable, &keyval->values, keyval->mask);

  return (gpointer) gc;
}
Exemple #11
0
/*!
  \brief initialize_gc() allocates and initializes the graphics contexts for
  the logviewer trace window.
  \param drawable is the pointer to the drawable surface
  \param type is the Graphics Context type? (I donno for sure)
  \returns Pointer to a GdkGC *
  */
G_MODULE_EXPORT GdkGC * initialize_gc(GdkDrawable *drawable, GcType type)
{
	GdkColor color;
	GdkGC * gc = NULL;
	GdkGCValues values;
	GdkColormap *cmap = NULL;

	cmap = gdk_colormap_get_system();

	switch((GcType)type)
	{
		case HIGHLIGHT:
			color.red = 60000;
			color.green = 0;
			color.blue = 0;
			gdk_colormap_alloc_color(cmap,&color,TRUE,TRUE);
			values.foreground = color;
			gc = gdk_gc_new_with_values(GDK_DRAWABLE(drawable),
					&values,
					GDK_GC_FOREGROUND);
			break;
		case FONT:
			color.red = 65535;
			color.green = 65535;
			color.blue = 65535;
			gdk_colormap_alloc_color(cmap,&color,TRUE,TRUE);
			values.foreground = color;
			gc = gdk_gc_new_with_values(GDK_DRAWABLE(drawable),
					&values,
					GDK_GC_FOREGROUND);
			break;

		case TRACE:
			hue += 60;
			/*printf("angle at %f, sat %f, val %f\n",hue,col_sat,col_val);*/

			if ((hue > 0) && ((GINT)hue%360 == 0))
			{
				hue+=30.0;
				col_sat=0.5;
				col_val=1.0;
			}
			if ((hue > 0) && ((GINT)hue%750 == 0))
			{
				hue+=30;
				col_sat=1.0;
				col_val = 0.75;
			}
			/*printf("JBA angle at %f, sat %f, val %f\n",hue,col_sat,col_val);*/
			color = get_colors_from_hue(hue,col_sat,col_val);
			gdk_colormap_alloc_color(cmap,&color,TRUE,TRUE);
			values.foreground = color;
			gc = gdk_gc_new_with_values(GDK_DRAWABLE(drawable),
					&values,
					GDK_GC_FOREGROUND);


			break;
		case GRATICULE:
			color.red = 36288;
			color.green = 2048;
			color.blue = 2048;
			gdk_colormap_alloc_color(cmap,&color,TRUE,TRUE);
			values.foreground = color;
			gc = gdk_gc_new_with_values(GDK_DRAWABLE(drawable),
					&values,
					GDK_GC_FOREGROUND);
			break;
		case TTM_AXIS:
			color.red = 32768;
			color.green = 32768;
			color.blue = 32768;
			gdk_colormap_alloc_color(cmap,&color,TRUE,TRUE);
			values.foreground = color;
			gc = gdk_gc_new_with_values(GDK_DRAWABLE(drawable),
					&values,
					GDK_GC_FOREGROUND);
			break;
		case TTM_TRACE:
			color.red = 0;
			color.green = 0;
			color.blue = 0;
			gdk_colormap_alloc_color(cmap,&color,TRUE,TRUE);
			values.foreground = color;
			gc = gdk_gc_new_with_values(GDK_DRAWABLE(drawable),
					&values,
					GDK_GC_FOREGROUND);
			break;
	}	
	return gc;	
}
static void
gdl_dock_master_xor_rect (GdlDockMaster *master)
{
    gint8         dash_list [2];
    GdkWindow    *window;
    GdkRectangle *rect;
    
    if (!master->_priv || !master->_priv->drag_request)
        return;
    
    master->_priv->rect_drawn = ~master->_priv->rect_drawn;
    
    if (master->_priv->rect_owner) {
        gdl_dock_xor_rect (master->_priv->rect_owner,
                           &master->_priv->drag_request->rect);
        return;
    }
    
    rect = &master->_priv->drag_request->rect;
    window = gdk_get_default_root_window ();

    if (!master->_priv->root_xor_gc) {
        GdkGCValues values;

        values.function = GDK_INVERT;
        values.subwindow_mode = GDK_INCLUDE_INFERIORS;
        master->_priv->root_xor_gc = gdk_gc_new_with_values (
            window, &values, GDK_GC_FUNCTION | GDK_GC_SUBWINDOW);
    };

#ifdef WIN32    
    GdkLineStyle lineStyle = GDK_LINE_ON_OFF_DASH;
    if (is_os_vista())
    {
        // On Vista the dash-line is increadibly slow to draw, it takes several minutes to draw the tracking lines
        // With GDK_LINE_SOLID it is parts of a second
        // No performance issue on WinXP
        lineStyle = GDK_LINE_SOLID;
    }
#else
    GdkLineStyle lineStyle = GDK_LINE_ON_OFF_DASH;
#endif
    gdk_gc_set_line_attributes (master->_priv->root_xor_gc, 1,
                                lineStyle,
                                GDK_CAP_NOT_LAST,
                                GDK_JOIN_BEVEL);
    
    dash_list[0] = 1;
    dash_list[1] = 1;
    gdk_gc_set_dashes (master->_priv->root_xor_gc, 1, dash_list, 2);

    gdk_draw_rectangle (window, master->_priv->root_xor_gc, 0, 
                        rect->x, rect->y,
                        rect->width, rect->height);

    gdk_gc_set_dashes (master->_priv->root_xor_gc, 0, dash_list, 2);

    gdk_draw_rectangle (window, master->_priv->root_xor_gc, 0, 
                        rect->x + 1, rect->y + 1,
                        rect->width - 2, rect->height - 2);
}
gboolean
rcm_motion_notify_event (GtkWidget      *widget,
			 GdkEventMotion *event,
			 RcmCircle      *circle)
{
  gfloat       clicked_angle, delta;
  gfloat      *alpha, *beta;
  gint         cw_ccw;
  GdkGCValues  values;

  alpha  = &(circle->angle->alpha);
  beta   = &(circle->angle->beta);
  cw_ccw = circle->angle->cw_ccw;
  delta  = angle_mod_2PI (cw_ccw * (*beta - *alpha));

  values.function = GDK_INVERT;
  xor_gc = gdk_gc_new_with_values (Current.From->preview->window,
                                   &values,
                                   GDK_GC_FUNCTION);

  clicked_angle = angle_mod_2PI (arctg (CENTER - event->y, event->x - CENTER));

  delta = clicked_angle - circle->prev_clicked;
  circle->prev_clicked = clicked_angle;

  if (delta)
    {
      if (circle->action_flag == DRAG_START)
        {
          gtk_widget_queue_draw (circle->preview);
          circle->action_flag = DRAGING;
        }
      else
        {
          /* this should be erasing entire angle */
          color_rotate_draw_arrows (widget->window, xor_gc, circle->angle);
        }

      if (circle->mode == EACH)
        {
          *(circle->target)=clicked_angle;
        }
      else
        {
          circle->angle->alpha=angle_mod_2PI(circle->angle->alpha + delta);
          circle->angle->beta =angle_mod_2PI(circle->angle->beta  + delta);
        }

      gdk_window_process_updates (widget->window, FALSE);
      color_rotate_draw_arrows (widget->window, xor_gc, circle->angle);

      gtk_spin_button_set_value (GTK_SPIN_BUTTON (circle->alpha_entry),
                                 circle->angle->alpha *
                                 rcm_units_factor(Current.Units));

      gtk_spin_button_set_value (GTK_SPIN_BUTTON (circle->beta_entry),
                                 circle->angle->beta *
                                 rcm_units_factor(Current.Units));

      if (Current.RealTime)
        rcm_render_preview (Current.Bna->after);
    }

  gdk_event_request_motions (event);

  return TRUE;
}
Exemple #14
0
static gboolean
gimp_histogram_view_expose (GtkWidget      *widget,
                            GdkEventExpose *event)
{
    GimpHistogramView *view  = GIMP_HISTOGRAM_VIEW (widget);
    GtkStyle          *style = gtk_widget_get_style (widget);
    gint               x;
    gint               x1, x2;
    gint               border;
    gint               width, height;
    gdouble            max    = 0.0;
    gdouble            bg_max = 0.0;
    gint               xstop;
    GdkGC             *gc_in;
    GdkGC             *gc_out;
    GdkGC             *bg_gc_in;
    GdkGC             *bg_gc_out;
    GdkGC             *rgb_gc[3]  = { NULL, NULL, NULL };

    if (! view->histogram && ! view->bg_histogram)
        return FALSE;

    border = view->border_width;
    width  = widget->allocation.width  - 2 * border;
    height = widget->allocation.height - 2 * border;

    x1 = CLAMP (MIN (view->start, view->end), 0, 255);
    x2 = CLAMP (MAX (view->start, view->end), 0, 255);

    gdk_draw_rectangle (widget->window,
                        style->base_gc[GTK_STATE_NORMAL], TRUE,
                        0, 0,
                        widget->allocation.width,
                        widget->allocation.height);

    /*  Draw the outer border  */
    gdk_draw_rectangle (widget->window,
                        style->dark_gc[GTK_STATE_NORMAL], FALSE,
                        border, border,
                        width - 1, height - 1);

    if (view->histogram)
        max = gimp_histogram_view_get_maximum (view, view->histogram,
                                               view->channel);

    if (view->bg_histogram)
        bg_max = gimp_histogram_view_get_maximum (view, view->bg_histogram,
                 view->channel);

    gc_in  = style->text_gc[GTK_STATE_SELECTED];
    gc_out = style->text_gc[GTK_STATE_NORMAL];

    bg_gc_in  = style->mid_gc[GTK_STATE_SELECTED];
    bg_gc_out = style->mid_gc[GTK_STATE_NORMAL];

    if (view->channel == GIMP_HISTOGRAM_RGB)
    {
        GdkGCValues  values;
        GdkColor     color;

        values.function = GDK_OR;

        for (x = 0; x < 3; x++)
        {
            rgb_gc[x] = gdk_gc_new_with_values (widget->window,
                                                &values, GDK_GC_FUNCTION);

            color.red   = (x == 0 ? 0xFFFF : 0x0);
            color.green = (x == 1 ? 0xFFFF : 0x0);
            color.blue  = (x == 2 ? 0xFFFF : 0x0);

            gdk_gc_set_rgb_fg_color (rgb_gc[x], &color);
        }
    }

    xstop = 1;
    for (x = 0; x < width; x++)
    {
        gboolean  in_selection = FALSE;

        gint  i = (x * 256) / width;
        gint  j = ((x + 1) * 256) / width;

        if (! (x1 == 0 && x2 == 255))
        {
            gint k = i;

            do
                in_selection |= (x1 <= k && k <= x2);
            while (++k < j);
        }

        if (view->subdivisions > 1 && x >= (xstop * width / view->subdivisions))
        {
            gdk_draw_line (widget->window,
                           style->dark_gc[GTK_STATE_NORMAL],
                           x + border, border,
                           x + border, border + height - 1);
            xstop++;
        }
        else if (in_selection)
        {
            gdk_draw_line (widget->window,
                           style->base_gc[GTK_STATE_SELECTED],
                           x + border, border,
                           x + border, border + height - 1);
        }

        if (view->channel == GIMP_HISTOGRAM_RGB)
        {
            gint c;

            for (c = 0; c < 3; c++)
                gimp_histogram_view_draw_spike (view, GIMP_HISTOGRAM_RED + c,
                                                style->black_gc,
                                                NULL,
                                                x, i, j, max, bg_max, height, border);

            for (c = 0; c < 3; c++)
                gimp_histogram_view_draw_spike (view, GIMP_HISTOGRAM_RED + c,
                                                rgb_gc[c],
                                                NULL,
                                                x, i, j, max, bg_max, height, border);

            gimp_histogram_view_draw_spike (view, view->channel,
                                            in_selection ? gc_in : gc_out,
                                            NULL,
                                            x, i, j, max, bg_max, height, border);
        }
        else
        {
            gimp_histogram_view_draw_spike (view, view->channel,
                                            in_selection ? gc_in : gc_out,
                                            in_selection ? bg_gc_in  : bg_gc_out,
                                            x, i, j, max, bg_max, height, border);
        }
    }

    if (view->channel == GIMP_HISTOGRAM_RGB)
    {
        for (x = 0; x < 3; x++)
            g_object_unref (rgb_gc[x]);
    }

    return FALSE;
}
Exemple #15
0
static PyObject *
PyGdkWindow_NewGC(PyGdkWindow_Object *self, PyObject *args, PyObject *kws)
{
    int i = 0;
    PyObject *key, *value;
    char *strkey;
    GdkGCValues values;
    GdkGCValuesMask mask = 0;
    GdkGC *gc;

    if (kws != NULL)
	while (PyDict_Next(kws, &i, &key, &value)) {
	    strkey = PyString_AsString(key);
	    if (!strcmp(strkey, "foreground")) {
		if (!PyGdkColor_Check(value)) {
		    PyErr_SetString(PyExc_TypeError,
				    "foreground argument takes a GdkColor");
		    return NULL;
		}
		mask |= GDK_GC_FOREGROUND;
		values.foreground.red = PyGdkColor_Get(value)->red;
		values.foreground.green = PyGdkColor_Get(value)->green;
		values.foreground.blue = PyGdkColor_Get(value)->blue;
		values.foreground.pixel = PyGdkColor_Get(value)->pixel;
	    } else if (!strcmp(strkey, "background")) {
		if (!PyGdkColor_Check(value)) {
		    PyErr_SetString(PyExc_TypeError,
				    "background argument takes a GdkColor");
		    return NULL;
		}
		mask |= GDK_GC_BACKGROUND;
		values.background.red = PyGdkColor_Get(value)->red;
		values.background.green = PyGdkColor_Get(value)->green;
		values.background.blue = PyGdkColor_Get(value)->blue;
		values.background.pixel = PyGdkColor_Get(value)->pixel;
	    } else if (!strcmp(strkey, "font")) {
		if (!PyGdkFont_Check(value)) {
		    PyErr_SetString(PyExc_TypeError,
				    "font argument takes a GdkFont");
		    return NULL;
		}
		mask |= GDK_GC_FONT;
		values.font = PyGdkFont_Get(value);
	    } else if (!strcmp(strkey, "tile")) {
		if (!PyGdkWindow_Check(value)) {
		    PyErr_SetString(PyExc_TypeError,
				    "tile argument takes a GdkPixmap");
		    return NULL;
		}
		mask |= GDK_GC_TILE;
		values.tile = PyGdkWindow_Get(value);
	    } else if (!strcmp(strkey, "stipple")) {
		if (!PyGdkWindow_Check(value)) {
		    PyErr_SetString(PyExc_TypeError,
				    "stipple argument takes a GdkPixmap");
		    return NULL;
		}
		mask |= GDK_GC_STIPPLE;
		values.stipple = PyGdkWindow_Get(value);
	    } else if (!strcmp(strkey, "clip_mask")) {
		if (!PyGdkWindow_Check(value)) {
		    PyErr_SetString(PyExc_TypeError,
				    "clip_mask argument takes a GdkPixmap");
		    return NULL;
		}
		mask |= GDK_GC_CLIP_MASK;
		values.clip_mask = PyGdkWindow_Get(value);
	    } else {
		int i = 0;
#ifndef offsetof
#define offsetof(type, member) ( (int) &((type*)0)->member)
#endif
#define OFF(x) offsetof(GdkGCValues, x)
		static struct {char *name;GdkGCValuesMask mask;int offs; } others[] = {
		    {"function", GDK_GC_FUNCTION, OFF(function)},
		    {"fill",     GDK_GC_FILL,     OFF(fill)},
		    {"subwindow_mode", GDK_GC_SUBWINDOW, OFF(subwindow_mode)},
		    {"ts_x_origin", GDK_GC_TS_X_ORIGIN, OFF(ts_x_origin)},
		    {"ts_y_origin", GDK_GC_TS_Y_ORIGIN, OFF(ts_y_origin)},
		    {"clip_x_origin", GDK_GC_CLIP_X_ORIGIN, OFF(clip_x_origin)},
		    {"clip_y_origin", GDK_GC_CLIP_Y_ORIGIN, OFF(clip_y_origin)},
		    {"graphics_exposures", GDK_GC_EXPOSURES, OFF(graphics_exposures)},
		    {"line_width", GDK_GC_LINE_WIDTH, OFF(line_width)},
		    {"line_style", GDK_GC_LINE_STYLE, OFF(line_style)},
		    {"cap_style", GDK_GC_CAP_STYLE, OFF(cap_style)},
		    {"join_style", GDK_GC_JOIN_STYLE, OFF(join_style)},
		    {NULL, 0, 0}
		};
#undef OFF
		while (others[i].name != NULL) {
		    if (!strcmp(strkey, others[i].name)) {
			if (!PyInt_Check(value)) {
			    char buf[80];
			    g_snprintf(buf, sizeof(buf),
				       "%s argument expects an integer",
				       others[i].name);
			    PyErr_SetString(PyExc_TypeError, buf);
			    return NULL;
			}
			mask |= others[i].mask;
			*((int *)((char *)&values + others[i].offs)) =
			    PyInt_AsLong(value);
			break;
		    }
		    i++;
		}
		if (others[i].name == NULL) {
		    PyErr_SetString(PyExc_TypeError, "unknown argument");
		    return NULL;
		}
	    }
	}
    if (!PyArg_ParseTuple(args, ":GdkWindow.new_gc"))
	return NULL;
    gc = gdk_gc_new_with_values(PyGdkWindow_Get(self), &values, mask);
    value = PyGdkGC_New(gc);
    g_object_unref(gc);
    return value;
}
Exemple #16
0
void
draw_check_mark(GdkWindow * window,
                GdkGC * gc,
		GdkRectangle * area,
		gint x,
		gint y,
		gint width,
		gint height,
		gint check_style)
{
   switch (check_style) {
      case FAST_CHECK : /* most common style */
        gdk_draw_line(window, gc, x, y+height-1, x, y+(height/2)-1);
        gdk_draw_line(window, gc, x+1, y+height-1, x+1, y+(height/2)-1);
        gdk_draw_line(window, gc, x+1, y+height-1, x+width, y - 1);
        gdk_draw_line(window, gc, x, y+height-1, x+width, y);
	break;
      case SLOPPY_CHECK : /* default theme style, not done so just fall through*/
      case CLEAN_CHECK :/* classic redmond style */
	x+=1;
	y+=1; 
	width-=2;
        height-=2; 

        /* short diagonal */
	gdk_draw_line(window, gc, x+0, y+height-5, x+0, y+height-2);/* Left Line */
        gdk_draw_line(window, gc, x+1, y+height-4, x+1, y+height-1);/* Right Line */

        /* Long Diagonal */
        gdk_draw_line(window, gc, x+2, y+height-3, x+width-1, y+0);/* Top Line */
        gdk_draw_line(window, gc, x+2, y+height-2, x+width-1, y+1);/* Center Line */
        gdk_draw_line(window, gc, x+2, y+height-1, x+width-1, y+2);/* Bottom Line */
	break;
      case X_CHECK : /* common(default?) style in kde themes */
        {
	  GdkGC * line_gc = NULL;
          if (width>=16) 
	  {
  	    GdkGCValues gc_vals;
	    gint off_1, off_2, off_3;
            gint line_width = ceil(((width + 1)/5));
	
	    if (!(line_width % 2)) line_width -= 1;
	    gdk_gc_get_values(gc, &gc_vals);
	    gc_vals.line_width = line_width;
	    gc_vals.cap_style = GDK_CAP_ROUND;

	    off_2 = gc_vals.line_width;
	    off_1 = off_2 - 1;
	    off_3 = off_2 + 1;

              line_gc = gdk_gc_new_with_values(window, &gc_vals,   GDK_GC_FOREGROUND | GDK_GC_BACKGROUND | GDK_GC_FUNCTION |
              GDK_GC_CLIP_MASK | GDK_GC_CLIP_X_ORIGIN | GDK_GC_CLIP_Y_ORIGIN | GDK_GC_LINE_WIDTH | GDK_GC_LINE_STYLE |
	      GDK_GC_CAP_STYLE);

  	    /* Backward Diagonal */
            gdk_draw_line(window, line_gc, x+off_1, y+off_1, x+width-off_2, y+height-off_2);/* Center Line */

            /* Forward Diagonal */
            gdk_draw_line(window, line_gc, x+off_1, y+height - off_2, x+width-off_2, y+off_1);/* Center Line */

  	    gdk_gc_unref(line_gc);
	  } else {
	    /* Backward Diagonal */
            if (width>=7) 
	      gdk_draw_line(window, gc, x+2, y+1, x+width-2, y+height-3);/* Top Line */
            gdk_draw_line(window, gc, x+1, y+1, x+width-2, y+height-2);/* Center Line */
            if (width>=7) 
              gdk_draw_line(window, gc, x+1, y+2, x+width-3, y+height-2);/* Bottom Line */

            /* Forward Diagonal */
            if (width>=7) 
              gdk_draw_line(window, gc, x+1, y+height-3, x+width-3, y+1);/* Top Line */
            gdk_draw_line(window, gc, x+1, y+height - 2, x+width-2, y+1);/* Center Line */
            if (width>=7) 
              gdk_draw_line(window, gc, x+2, y+height - 2, x+width-2, y+2);/* Bottom Line */
          }	  
	}
	break;	
      case BLOCK_CHECK : /* square check style, like mist */
        gdk_draw_rectangle(window, gc, TRUE, x+1, y+1, width-2, height-2); 
	break;	
      case CIRCLE_CHECK : /* round check style, like mist, but with circles */
        gdk_draw_arc(window, gc, TRUE, x + width / 4, y + height / 4, width / 2 + 1, height / 2 + 1, 0, 360*64); 
        gdk_draw_arc(window, gc, FALSE, x + width / 4, y + height / 4, width / 2 + 1, height / 2 + 1, 0, 360*64); 
	break;	
      case DIAMOND_CHECK : /* diamond check style, like mist, but with diamonds */
	{
	  GdkPoint * points = g_new(GdkPoint, 5);
          
	  x+=1;
	  y+=1; 
	  width-=2;
	  height-=2; 
	  
	  points[0].x = x + width/2;
	  points[0].y = y;

	  points[1].x = x + width;
	  points[1].y = y + height/2;

	  points[2].x = x + width/2;
	  points[2].y = y + height;
	  
	  points[3].x = x;
	  points[3].y = y + height/2;

	  points[4].x = x + width/2;
	  points[4].y = y;
	  
	  gdk_draw_polygon(window, gc, TRUE, points, 5);
	  gdk_draw_polygon(window, gc, FALSE, points, 5);
	  
	  g_free(points);
	}
	break;	
      case XPM_CHECK : /* custom check in xpm format */
	break;	
      case NO_CHECK :
      default :
        return;
   }   
}
Exemple #17
0
static GdkGC *
gimp_canvas_gc_new (GimpCanvas      *canvas,
                    GimpCanvasStyle  style)
{
  GdkGC           *gc;
  GdkGCValues      values;
  GdkGCValuesMask  mask = 0;
  GdkColor         fg   = { 0, 0, 0, 0 };
  GdkColor         bg   = { 0, 0, 0, 0 };

  if (! GTK_WIDGET_REALIZED (canvas))
    return NULL;

  switch (style)
    {
    case GIMP_CANVAS_STYLE_BLACK:
    case GIMP_CANVAS_STYLE_WHITE:
    case GIMP_CANVAS_STYLE_SAMPLE_POINT_NORMAL:
    case GIMP_CANVAS_STYLE_SAMPLE_POINT_ACTIVE:
      break;

    case GIMP_CANVAS_STYLE_RENDER:
      mask |= GDK_GC_EXPOSURES;
      values.graphics_exposures = TRUE;
      break;

    case GIMP_CANVAS_STYLE_XOR_DOTTED:
    case GIMP_CANVAS_STYLE_XOR_DASHED:
      mask |= GDK_GC_LINE_STYLE;
      values.line_style = GDK_LINE_ON_OFF_DASH;
      /*  fallthrough  */

    case GIMP_CANVAS_STYLE_XOR:
      mask |= GDK_GC_FUNCTION | GDK_GC_CAP_STYLE | GDK_GC_JOIN_STYLE;

      if (gimp_canvas_get_xor_color (canvas, &fg))
        values.function = GDK_XOR;
      else
        values.function = GDK_INVERT;

      values.cap_style  = GDK_CAP_NOT_LAST;
      values.join_style = GDK_JOIN_MITER;
      break;

    case GIMP_CANVAS_STYLE_SELECTION_IN:
    case GIMP_CANVAS_STYLE_SELECTION_OUT:
    case GIMP_CANVAS_STYLE_LAYER_BOUNDARY:
    case GIMP_CANVAS_STYLE_GUIDE_NORMAL:
    case GIMP_CANVAS_STYLE_GUIDE_ACTIVE:
      mask |= GDK_GC_CAP_STYLE | GDK_GC_FILL | GDK_GC_STIPPLE;
      values.cap_style = GDK_CAP_NOT_LAST;
      values.fill      = GDK_OPAQUE_STIPPLED;
      values.stipple   = canvas->stipple[0];
      break;

    case GIMP_CANVAS_STYLE_CUSTOM:
    default:
      return NULL;
    }

  gc = gdk_gc_new_with_values (GTK_WIDGET (canvas)->window, &values, mask);

  if (style == GIMP_CANVAS_STYLE_XOR_DOTTED)
    {
      gint8 one = 1;
      gdk_gc_set_dashes (gc, 0, &one, 1);
    }

  switch (style)
    {
    default:
      return gc;

    case GIMP_CANVAS_STYLE_XOR_DOTTED:
    case GIMP_CANVAS_STYLE_XOR_DASHED:
    case GIMP_CANVAS_STYLE_XOR:
      break;

    case GIMP_CANVAS_STYLE_WHITE:
      fg.red   = 0xffff;
      fg.green = 0xffff;
      fg.blue  = 0xffff;
      break;

    case GIMP_CANVAS_STYLE_BLACK:
    case GIMP_CANVAS_STYLE_SELECTION_IN:
      fg.red   = 0x0;
      fg.green = 0x0;
      fg.blue  = 0x0;

      bg.red   = 0xffff;
      bg.green = 0xffff;
      bg.blue  = 0xffff;
      break;

    case GIMP_CANVAS_STYLE_SELECTION_OUT:
      fg.red   = 0xffff;
      fg.green = 0xffff;
      fg.blue  = 0xffff;

      bg.red   = 0x7f7f;
      bg.green = 0x7f7f;
      bg.blue  = 0x7f7f;
      break;

    case GIMP_CANVAS_STYLE_LAYER_BOUNDARY:
      fg.red   = 0x0;
      fg.green = 0x0;
      fg.blue  = 0x0;

      bg.red   = 0xffff;
      bg.green = 0xffff;
      bg.blue  = 0x0;
      break;

    case GIMP_CANVAS_STYLE_GUIDE_NORMAL:
      fg.red   = 0x0;
      fg.green = 0x0;
      fg.blue  = 0x0;

      bg.red   = 0x0;
      bg.green = 0x7f7f;
      bg.blue  = 0xffff;
      break;

    case GIMP_CANVAS_STYLE_GUIDE_ACTIVE:
      fg.red   = 0x0;
      fg.green = 0x0;
      fg.blue  = 0x0;

      bg.red   = 0xffff;
      bg.green = 0x0;
      bg.blue  = 0x0;
      break;

    case GIMP_CANVAS_STYLE_SAMPLE_POINT_NORMAL:
      fg.red   = 0x0;
      fg.green = 0x7f7f;
      fg.blue  = 0xffff;
      break;

    case GIMP_CANVAS_STYLE_SAMPLE_POINT_ACTIVE:
      fg.red   = 0xffff;
      fg.green = 0x0;
      fg.blue  = 0x0;
      break;
    }

  gdk_gc_set_rgb_fg_color (gc, &fg);
  gdk_gc_set_rgb_bg_color (gc, &bg);

  return gc;
}
static GdkRectangle *
select_area ()
{
  GdkWindow               *root;
  GdkCursor               *cursor;
  select_area_filter_data  data;
  GdkGCValues              values;
  GdkColor                 color;
  GdkRectangle            *rectangle;

  root   = gdk_get_default_root_window ();
  cursor = gdk_cursor_new (GDK_CROSSHAIR);

  if (gdk_pointer_grab (root, FALSE,
                        GDK_POINTER_MOTION_MASK|GDK_BUTTON_PRESS_MASK|GDK_BUTTON_RELEASE_MASK,
                        NULL, cursor,
                        GDK_CURRENT_TIME) != GDK_GRAB_SUCCESS)
    {
      gdk_cursor_unref (cursor);
      return FALSE;
    }

  gdk_keyboard_grab (root, FALSE, GDK_CURRENT_TIME);

  gdk_window_add_filter (root, (GdkFilterFunc) select_area_filter, &data);

  gdk_flush ();

  data.rect.x = 0;
  data.rect.y = 0;
  data.rect.width  = 0;
  data.rect.height = 0;
  data.button_pressed = FALSE;
  data.root = root;

  values.function = GDK_XOR;
  values.fill = GDK_SOLID;
  values.clip_mask = NULL;
  values.subwindow_mode = GDK_INCLUDE_INFERIORS;
  values.clip_x_origin = 0;
  values.clip_y_origin = 0;
  values.graphics_exposures = 0;
  values.line_width = 0;
  values.line_style = GDK_LINE_SOLID;
  values.cap_style = GDK_CAP_BUTT;
  values.join_style = GDK_JOIN_MITER;

  data.gc = gdk_gc_new_with_values (root, &values,
                                    GDK_GC_FUNCTION | GDK_GC_FILL |
                                    GDK_GC_CLIP_MASK | GDK_GC_SUBWINDOW |
                                    GDK_GC_CLIP_X_ORIGIN |
                                    GDK_GC_CLIP_Y_ORIGIN | GDK_GC_EXPOSURES |
                                    GDK_GC_LINE_WIDTH | GDK_GC_LINE_STYLE |
                                    GDK_GC_CAP_STYLE | GDK_GC_JOIN_STYLE);
  gdk_color_parse ("white", &color);
  gdk_gc_set_rgb_fg_color (data.gc, &color);
  gdk_color_parse ("black", &color);
  gdk_gc_set_rgb_bg_color (data.gc, &color);

  gtk_main ();

  g_object_unref (data.gc);

  gdk_window_remove_filter (root, (GdkFilterFunc) select_area_filter, &data);

  gdk_keyboard_ungrab (GDK_CURRENT_TIME);
  gdk_pointer_ungrab (GDK_CURRENT_TIME);
  gdk_cursor_unref (cursor);

  if (data.rect.width == 0 && data.rect.height == 0)
    return NULL;

  rectangle = g_new0 (GdkRectangle, 1);
  rectangle->x = data.rect.x;
  rectangle->y = data.rect.y;
  rectangle->width  = data.rect.width + 1;
  rectangle->height = data.rect.height + 1;

  return rectangle;
}
Exemple #19
0
/* The GdkGCValues structure holds a set of values used to create or
   modify a graphics context.
GdkColor foreground;	the foreground color.
GdkColor background;	the background color.
GdkFont *font;		the default font..
GdkFunction function;	the bitwise operation used when drawing.
GdkFill fill;		the fill style.
GdkPixmap *tile;	the tile pixmap.
GdkPixmap *stipple;	the stipple bitmap.
GdkPixmap *clip_mask;	the clip mask bitmap.
GdkSubwindowMode subwindow_mode; the subwindow mode.
gint ts_x_origin;	the x origin of the tile or stipple.
gint ts_y_origin;	the y origin of the tile or stipple.
gint clip_x_origin;	the x origin of the clip mask.
gint clip_y_origin;	the y origin of the clip mask.
gint graphics_exposures; whether graphics exposures are enabled.
gint line_width;	the line width
GdkLineStyle line_style; the way dashed lines are drawn
GdkCapStyle cap_style;	the way the ends of lines are drawn
GdkJoinStyle join_style; the way joins between lines are drawn
*/
int
clip_GDK_GCNEWWITHVALUES(ClipMachine * cm)
{
	ClipVar    *cv = _clip_spar(cm,1);
	C_widget *cwid = _fetch_cwidget(cm,_clip_spar(cm,2));
	ClipVar  *cval = _clip_spar(cm,3);
	long      mask = _clip_parnl(cm,4);
	GdkGC *gc;
	GdkGCValues gcv;
	GdkFont *font = 0;
	C_object *cgc, *cfont;
	ClipVar *c;
	C_widget *cw;
	double d;
	CHECKOPT(1,MAP_t); CHECKARG2(2,NUMERIC_t,MAP_t);
	CHECKARG(3,MAP_t); CHECKARG(4,NUMERIC_t);

	/* the foreground color. */
	if ( (c = _clip_mget( cm, cval, HASH_FOREGROUND )) != NULL )
		_map_colors_to_gdk(cm, c, &gcv.foreground);
	/* the background color. */
	if ( (c = _clip_mget( cm, cval, HASH_BACKGROUND )) != NULL )
		_map_colors_to_gdk(cm, c, &gcv.background);
	/* Set default font */
	switch ( _clip_mtype(cm,cval,HASH_FONT) )
	{
		case CHARACTER_t:
			c = _clip_mget(cm,cval,HASH_FONT);
			font = gdk_font_load(c->s.str.buf);
			break;
		case MAP_t:
		case NUMERIC_t:
			cfont = _fetch_cobject(cm,_clip_mget(cm,cval,HASH_FONT));
			if (cfont)
			{
				font = (GdkFont*)cfont->object;
				cfont->ref_count++;
			}
			break;
		default:
			break;
	}
	if (font)
	{
		gcv.font = font;
		gdk_font_ref (gcv.font);
	}
	/* the bitwise operation used when drawing. */
	/* Determines how the bit values for the source pixels are combined with the
	   bit values for destination pixels to produce the final result. The sixteen
	   values here correspond to the 16 different possible 2x2 truth tables. Only
	   a couple of these values are usually useful; for colored images, only
	   GDK_COPY, GDK_XOR and GDK_INVERT are generally useful. For bitmaps, GDK_AND
	   and GDK_OR are also useful. */
	_clip_mgetn(cm,cval,HASH_FUNCTION,&d);
	gcv.function = (GdkFunction)d;
	/* the fill style. */
	_clip_mgetn(cm,cval,HASH_FILL,&d);
	gcv.fill = (GdkFill)d;
	/* the tile pixmap. */
	if ( (c = _clip_mget( cm, cval, HASH_TILE )) != NULL )
	{
		cw = _fetch_cwidget(cm,c);
		gcv.tile = cw ? GTK_PIXMAP(cw->widget)->pixmap : NULL;
	}
	/* the stipple pixmap. */
	if ( (c = _clip_mget( cm, cval, HASH_STIPPLE )) != NULL )
	{
		cw = _fetch_cwidget(cm,c);
		gcv.stipple = cw ? GTK_PIXMAP(cw->widget)->pixmap : NULL;
	}
	/* the clip mask bitmap. */
	if ( (c = _clip_mget( cm, cval, HASH_CLIPMASK )) != NULL )
	{
		cw = _fetch_cwidget(cm,c);
		gcv.clip_mask = cw ? GTK_PIXMAP(cw->widget)->pixmap : NULL;
	}
	/* the subwindow mode. */
	_clip_mgetn(cm,cval,HASH_SUBWINDOWMODE,&d);
	gcv.subwindow_mode = (GdkSubwindowMode)d;
	/* the x origin of the tile or stipple. */
	_clip_mgetn(cm,cval,HASH_TSXORIGIN,&d);
	gcv.ts_x_origin = (gint)d;
	/* the y origin of the tile or stipple. */
	_clip_mgetn(cm,cval,HASH_TSYORIGIN,&d);
	gcv.ts_y_origin = (gint)d;
	/* the x origin of the clip mask. */
	_clip_mgetn(cm,cval,HASH_CLIPXORIGIN,&d);
	gcv.clip_x_origin = (gint)d;
	/* the y origin of the clip mask. */
	_clip_mgetn(cm,cval,HASH_CLIPYORIGIN,&d);
	gcv.clip_y_origin = (gint)d;
	/* whether graphics exposures are enabled. */
	_clip_mgetn(cm,cval,HASH_GRAPHICSEXPOSURES,&d);
	gcv.graphics_exposures = (gint)d;
	/* the line width */
	_clip_mgetn(cm,cval,HASH_LINEWITDH,&d);
	gcv.line_width = (gint)d;
	/* the way dashed lines are drawn */
	_clip_mgetn(cm,cval,HASH_LINESTYLE,&d);
	gcv.line_style = (GdkLineStyle)d;
	/* the way the ends of lines are drawn */
	_clip_mgetn(cm,cval,HASH_CAPSTYLE,&d);
	gcv.cap_style = (GdkCapStyle)d;
	/* the way joins between lines are drawn */
	_clip_mgetn(cm,cval,HASH_JOINSTYLE,&d);
	gcv.join_style = (GdkJoinStyle)d;

	gc = gdk_gc_new_with_values(cwid->widget->window, &gcv, mask);
	if (gc)
	{
//		gdk_gc_ref(gc);
		cgc = _register_object(cm,gc,GDK_OBJECT_GC,cv,
			(coDestructor)gdk_object_gc_destructor);
		if (cgc)
		{
			cgc->ref_count=1;
			_clip_mclone(cm,RETPTR(cm),&cgc->obj);
		}
		else
			gdk_gc_unref(gc);

	}
	return 0;
err:
	return 1;
}