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 + -
显示快捷键?