samview.c

来自「A GTK sound font editor. Sound font file」· C语言 代码 · 共 1,307 行 · 第 1/3 页

C
1,307
字号
  GtkSVMark *marker;  g_return_if_fail (samview != NULL);  g_return_if_fail (IS_SAMVIEW (samview));  marker = g_slist_nth_data (samview->markers, marknum);  if (!marker)    return;  samview->sel_marker = marker;  samview_redraw (samview);}voidsamview_unselect_marker (SamView * samview){  g_return_if_fail (samview != NULL);  g_return_if_fail (IS_SAMVIEW (samview));  samview->sel_marker = NULL;  samview_redraw (samview);}/* sets the selected marker to the given x position in pixels */gintsamview_set_selected_marker_xpos (SamView * samview, gint * xpos){  gint vheight, vwidth;  gint pos;  g_return_val_if_fail (samview != NULL, -1);  g_return_val_if_fail (IS_SAMVIEW (samview), -1);  /* make sure there is a marker selected */  if (!samview->sel_marker)    return (-1);  vheight = GTK_WIDGET (samview)->allocation.height - 1;  vwidth = GTK_WIDGET (samview)->allocation.width - 1;  /* calculate corresponding sample position and clamp to limits */  VIEW_X2SAMPOS (pos, *xpos, samview);  samview->sel_marker->pos = CLAMP (pos, 0, samview->length - 1);  /* if sample pos out of range, then recalculate correct xpos */  if (samview->sel_marker->pos != pos)    {      pos = samview->sel_marker->pos;      VIEW_SAM2XPOS (*xpos, pos, samview);    }  /* clear old marker (GC function is XOR) */  gdk_draw_line (samview->samview_pm, samview->selmark_gc,    samview->sel_marker->xpos, 0, samview->sel_marker->xpos, vheight);  gdk_draw_pixmap (GTK_WIDGET (samview)->window,    GTK_WIDGET (samview)->style->fg_gc[GTK_STATE_SELECTED],    samview->samview_pm, samview->sel_marker->xpos, 0,    samview->sel_marker->xpos, 0, 1, vheight);  samview->sel_marker->xpos = *xpos;  /* draw marker */  gdk_draw_line (samview->samview_pm, samview->selmark_gc, *xpos, 0,    *xpos, vheight);  gdk_draw_pixmap (GTK_WIDGET (samview)->window,    GTK_WIDGET (samview)->style->fg_gc[GTK_STATE_SELECTED],    samview->samview_pm, *xpos, 0, *xpos, 0, 1, vheight);  return (pos);}voidsamview_set_selection (SamView * samview, gint start, gint end){  g_return_if_fail (samview != NULL);  g_return_if_fail (IS_SAMVIEW (samview));  if (start <= end)    {      samview->select_start = start;      samview->select_end = end;    }  else    {      samview->select_start = end;      samview->select_end = start;    }  samview_redraw (samview);  gtk_signal_emit (GTK_OBJECT (samview), samview_signals[SELECTION_CHANGE]);}static voidsamview_destroy (GtkObject * object){  SamView *samview;  GSList *p;  g_return_if_fail (object != NULL);  g_return_if_fail (IS_SAMVIEW (object));  samview = SAMVIEW (object);  if (samview->markers)    {      p = samview->markers;      while (p)	{	  gdk_gc_unref (((GtkSVMark *) (p->data))->gc);	  g_free (p->data);	  p = g_slist_next (p);	}      g_slist_free (samview->markers);    }  if (samview->samview_pm)    gdk_pixmap_unref (samview->samview_pm);  if (samview->sam_gc)    {      gdk_gc_unref (samview->sam_gc);      gdk_gc_unref (samview->cline_gc);      gdk_gc_unref (samview->realpos_gc);    }  if (samview->selmark_gc)    gdk_gc_unref (samview->selmark_gc);  if (GTK_OBJECT_CLASS (parent_class)->destroy)    (*GTK_OBJECT_CLASS (parent_class)->destroy) (object);}static voidsamview_size_request (GtkWidget * widget, GtkRequisition * requisition){  requisition->width = SAMVIEW_DEFAULT_SIZEX;  requisition->height = SAMVIEW_DEFAULT_SIZEY;}static voidsamview_size_allocate (GtkWidget * widget, GtkAllocation * allocation){  SamView *samview;  g_return_if_fail (widget != NULL);  g_return_if_fail (IS_SAMVIEW (widget));  g_return_if_fail (allocation != NULL);  widget->allocation = *allocation;  samview = SAMVIEW (widget);  if (GTK_WIDGET_REALIZED (widget))    {      if (samview->samview_pm)	{	  gdk_pixmap_unref (samview->samview_pm);	  samview->samview_pm = NULL;	}      gdk_window_move_resize (widget->window, allocation->x, allocation->y,	allocation->width, allocation->height);    }  gtk_signal_emit (GTK_OBJECT (samview), samview_signals[VIEW_CHANGE]);}static voidsamview_realize (GtkWidget * widget){  SamView *samview;  GdkWindowAttr attributes;  gint attributes_mask;  GdkColormap *cmap;  g_return_if_fail (widget != NULL);  g_return_if_fail (IS_SAMVIEW (widget));  GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);  samview = SAMVIEW (widget);  attributes.x = widget->allocation.x;  attributes.y = widget->allocation.y;  attributes.width = widget->allocation.width;  attributes.height = widget->allocation.height;  attributes.wclass = GDK_INPUT_OUTPUT;  attributes.window_type = GDK_WINDOW_CHILD;  attributes.event_mask = gtk_widget_get_events (widget) |    GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK |    GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK |    GDK_POINTER_MOTION_HINT_MASK;  attributes.visual = gtk_widget_get_visual (widget);  attributes.colormap = gtk_widget_get_colormap (widget);  attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;  widget->window = gdk_window_new (gtk_widget_get_parent_window (widget),    &attributes, attributes_mask);  gdk_window_set_user_data (widget->window, widget);  widget->style = gtk_style_attach (widget->style, widget->window);  gtk_style_set_background (widget->style, widget->window, GTK_STATE_ACTIVE);  cmap = gdk_window_get_colormap (widget->window);  gdk_colormap_alloc_color (cmap, &samview->bg_clr, FALSE, TRUE);  gdk_colormap_alloc_color (cmap, &samview->sam_clr, FALSE, TRUE);  gdk_colormap_alloc_color (cmap, &samview->cline_clr, FALSE, TRUE);  gdk_colormap_alloc_color (cmap, &samview->realpos_clr, FALSE, TRUE);  gdk_colormap_alloc_color (cmap, &samview->selmark_clr, FALSE, TRUE);  gdk_colormap_alloc_color (cmap, &samview->select_clr, FALSE, TRUE);  samview->bg_gc = gdk_gc_new (widget->window);  gdk_gc_set_foreground (samview->bg_gc, &samview->bg_clr);  samview->sam_gc = gdk_gc_new (widget->window);  gdk_gc_set_foreground (samview->sam_gc, &samview->sam_clr);  samview->cline_gc = gdk_gc_new (widget->window);  gdk_gc_set_function (samview->cline_gc, GDK_XOR);  gdk_gc_set_foreground (samview->cline_gc, &samview->cline_clr);  samview->realpos_gc = gdk_gc_new (widget->window);  gdk_gc_set_function (samview->realpos_gc, GDK_XOR);  gdk_gc_set_foreground (samview->realpos_gc, &samview->realpos_clr);  samview->selmark_gc = gdk_gc_new (widget->window);  gdk_gc_set_function (samview->selmark_gc, GDK_XOR);  gdk_gc_set_foreground (samview->selmark_gc, &samview->selmark_clr);  samview->select_gc = gdk_gc_new (widget->window);  gdk_gc_set_function (samview->select_gc, GDK_XOR);  gdk_gc_set_foreground (samview->select_gc, &samview->select_clr);}static gintsamview_expose (GtkWidget * widget, GdkEventExpose * event){  SamView *samview;  g_return_val_if_fail (widget != NULL, FALSE);  g_return_val_if_fail (IS_SAMVIEW (widget), FALSE);  g_return_val_if_fail (event != NULL, FALSE);  samview = SAMVIEW (widget);  if (!samview->samview_pm)    {      samview_draw (widget);    }  gdk_draw_pixmap (widget->window,    widget->style->fg_gc[GTK_WIDGET_STATE (widget)],    samview->samview_pm, event->area.x, event->area.y,    event->area.x, event->area.y, event->area.width, event->area.height);  return (FALSE);}#if 0/* fast compared to what? */static voidsamview_fast_draw_selection (SamView * samview,  gint newxbegin, gint newxend, gboolean newsel){  GtkWidget *widget;  gint x[4];  gboolean overlap = FALSE;  gint areas = 0;  if (!newsel)    {      if (samview->select_start == -1)	return;      areas = 1;      VIEW_SAM2XPOS (x[0], samview->select_start, samview);      VIEW_SAM2XPOS (x[1], samview->select_end, samview);    }  else if (samview->select_start == -1)    {      if (!newsel)	return;      areas = 1;      x[0] = newxbegin;      x[1] = newxend;    }  else    {      areas = 2;      x[0] = newxbegin;      x[1] = newxend;      VIEW_SAM2XPOS (x[2], samview->select_start, samview);      VIEW_SAM2XPOS (x[3], samview->select_end, samview);      /* check if old and new selections overlap */      if ((x[0] >= x[2] && x[0] <= x[3]) || (x[1] >= x[2] && x[1] <= x[3])	|| (x[2] >= x[0] && x[2] <= x[1]) || (x[3] >= x[0] && x[3] <= x[1]))	overlap = TRUE;      /* sort x positions */      CMPSWAP (x[0], x[3]);      CMPSWAP (x[0], x[2]);      CMPSWAP (x[0], x[1]);      CMPSWAP (x[1], x[3]);      CMPSWAP (x[1], x[2]);      CMPSWAP (x[2], x[3]);      if (overlap)	{	  x[1]--;	  x[2]++;	}    }  widget = GTK_WIDGET (samview);  if (areas > 0 && x[0] <= x[1])    {      gdk_draw_rectangle (samview->samview_pm, samview->select_gc, TRUE,	x[0], 0, x[1] - x[0] + 1, widget->allocation.height);    }  if (areas > 1 && x[2] <= x[3])    {      gdk_draw_rectangle (samview->samview_pm, samview->select_gc, TRUE,	x[2], 0, x[3] - x[2] + 1, widget->allocation.height);    }  samview->select_start = newbegin;  samview->select_end = newend;  gtk_signal_emit (GTK_OBJECT (samview), samview_signals[SELECTION_CHANGE]);}#endifstatic voidsamview_adjustment_changed (GtkAdjustment * adj, SamView * samview){  samview->start = adj->value;  samview->size = adj->page_size;  samview_redraw (samview);  gtk_signal_emit (GTK_OBJECT (samview), samview_signals[VIEW_CHANGE]);}static voidsamview_adjustment_value_changed (GtkAdjustment * adj, SamView * samview){  samview->start = adj->value;  samview_redraw (samview);  gtk_signal_emit (GTK_OBJECT (samview), samview_signals[VIEW_CHANGE]);}static voidsamview_redraw (SamView * samview){  if (samview->freeze_count)    return;  samview_draw (GTK_WIDGET (samview));  gtk_widget_queue_draw (GTK_WIDGET (samview));}static voidsamview_draw (GtkWidget * widget){  SamView *samview;  gint vwidth, vheight;		/* view physical (pixel) width and height */  gint vmid;			/* vertical middle point */  gint x, y, lasty, i;  float xmul, ymul;		/* Number of samples per pixel for x and y */  GtkSVMark *mark;  GdkColormap *cmap;  GdkGC *gc;  GtkStyle *style;  GSList *p;  g_return_if_fail (widget != NULL);  g_return_if_fail (IS_SAMVIEW (widget));  if (!GTK_WIDGET_REALIZED (widget))    return;  samview = SAMVIEW (widget);  if (!samview->samview_pm)    {      samview->samview_pm = gdk_pixmap_new (widget->window,	widget->allocation.width, widget->allocation.height, -1);    }  vwidth = widget->allocation.width;	/* view width in pixels */  vheight = widget->allocation.height;	/* view height */  style = gtk_widget_get_style (widget);  /* blank out sample view */  gdk_draw_rectangle (samview->samview_pm, samview->bg_gc, TRUE,    0, 0, vwidth, vheight);  if (!samview->samdata)    return;  /* if zoom active: draw "snap" line and original sample line (if any) */  if (samview->zoom_btn != 0)    {      gint xpos;		/* current zoom x position */      gdk_draw_line (samview->samview_pm, samview->cline_gc,	samview->zoom_pos, 0, samview->zoom_pos, vheight - 1);      VIEW_SAM2XPOS (xpos, samview->zoom_sampos, samview);      /* if original zoom point has moved more than 2 pixels */      if (abs (xpos - samview->zoom_pos) > 2)	{	  /* draw original sample "snap" line */	  gdk_draw_line (samview->samview_pm, samview->realpos_gc,	    xpos, 0, xpos, vheight - 1);	}    }  /* draw marker lines */  p = samview->markers;  while (p)    {				/* loop through markers */      mark = (GtkSVMark *) (p->data);      p = g_slist_next (p);      /* if marker is disabled (pos == -1) or not in view, then skip */      if (mark->pos == -1 || mark->pos < samview->start	|| mark->pos >= samview->start + samview->size)	{	  mark->xpos = -1;	  continue;

⌨️ 快捷键说明

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