📄 gseisviewaxistraces.c
字号:
while (start_label_index < first_value_index) start_label_index += labels_step; end_label_index = ((gint)(last_value_index / labels_step)) * labels_step; while (end_label_index > last_value_index) end_label_index -= labels_step; labels_num = (end_label_index - start_label_index) / labels_step + 1; labels_step_object = labels_step * value_to_object_scale; } start_label_object = data_visibility->slow_start_object + (start_label_index - first_value_index) * value_to_object_scale; private->display_list_base = glGenLists (1); glNewList (private->display_list_base, GL_COMPILE); glPushAttrib (GL_LINE_BIT | GL_LIST_BIT); glListBase (private->font_list_base); /* Preceding label - might be visible partially */ if (start_label_index - labels_step >= 0) { if (private->values) { if (G_SEIS_VIEW_AXIS_TRACES_INTEGER == private->format) g_snprintf (gbuffer, G_ASCII_DTOSTR_BUF_SIZE, private->gformat, g_array_index (private->values, gint32, (gint)(start_label_index - labels_step))); else g_ascii_formatd (gbuffer, G_ASCII_DTOSTR_BUF_SIZE, private->gformat, g_array_index (private->values, gdouble, (gint)(start_label_index - labels_step))); } else label_str = g_ptr_array_index (private->str_values, (gint)(start_label_index - labels_step)); /* Text length */ for (label_strlen = 0; label_str[label_strlen] != '\0'; label_strlen++); glRasterPos2f (start_label_object, fast_start_object - tick_size_object * 1.75 + text_height_object * first_glyph_shift); glBitmap (0, 0, 0, 0, -labels_step_object / slow_pixel_to_object_scale + private->text_width_screen * (label_strlen / (gdouble)private->label_max_strlen) / -2.0, 0, NULL); glCallLists (label_strlen, GL_UNSIGNED_BYTE, (GLubyte*)label_str); } for (i = 0; i < labels_num; i++) { if (private->values) { if (G_SEIS_VIEW_AXIS_TRACES_INTEGER == private->format) g_snprintf (gbuffer, G_ASCII_DTOSTR_BUF_SIZE, private->gformat, g_array_index (private->values, gint32, (gint)(start_label_index + i * labels_step))); else g_ascii_formatd (gbuffer, G_ASCII_DTOSTR_BUF_SIZE, private->gformat, g_array_index (private->values, gdouble, (gint)(start_label_index + i * labels_step))); } else label_str = g_ptr_array_index (private->str_values, (gint)(start_label_index + i * labels_step)); /* Text length */ for (label_strlen = 0; label_str[label_strlen] != '\0'; label_strlen++); glRasterPos2f (start_label_object + i * labels_step_object, fast_start_object - tick_size_object * 1.75 + text_height_object * first_glyph_shift); glBitmap (0, 0, 0, 0, private->text_width_screen * (label_strlen / (gdouble)private->label_max_strlen) / -2.0, 0, NULL); glCallLists (label_strlen, GL_UNSIGNED_BYTE, (GLubyte*)label_str); /* Tick */ glBegin (GL_LINES); glVertex2f (start_label_object + i * labels_step_object, fast_start_object - tick_size_object); glVertex2f (start_label_object + i * labels_step_object, fast_start_object); glEnd (); } /* Trailing label - might be visible partially */ if (start_label_index + labels_num * labels_step < values_num) { if (private->values) { if (G_SEIS_VIEW_AXIS_TRACES_INTEGER == private->format) g_snprintf (gbuffer, G_ASCII_DTOSTR_BUF_SIZE, private->gformat, g_array_index (private->values, gint32, (gint)(start_label_index + labels_num * labels_step))); else g_ascii_formatd (gbuffer, G_ASCII_DTOSTR_BUF_SIZE, private->gformat, g_array_index (private->values, gdouble, (gint)(start_label_index + labels_num * labels_step))); } else label_str = g_ptr_array_index (private->str_values, (gint)(start_label_index + labels_num * labels_step)); /* Text length */ for (label_strlen = 0; label_str[label_strlen] != '\0'; label_strlen++); glRasterPos2f (start_label_object + (labels_num - 1) * labels_step_object, fast_start_object - tick_size_object * 1.75 + text_height_object * first_glyph_shift); glBitmap (0, 0, 0, 0, labels_step_object / slow_pixel_to_object_scale + private->text_width_screen * (label_strlen / (gdouble)private->label_max_strlen) / -2.0, 0, NULL); glCallLists (label_strlen, GL_UNSIGNED_BYTE, (GLubyte*)label_str); } /* Border line */ glLineWidth (2); glBegin (GL_LINES); glVertex2f (data_visibility->slow_start_object, fast_start_object); glVertex2f (data_visibility->slow_start_object + data_visibility->slow_size_object, fast_start_object); glEnd (); glPopAttrib (); glEndList (); private->redisplay = FALSE; if (private->rendering_mutex) g_mutex_unlock (private->rendering_mutex); } if (private->display_list_base) glCallList (private->display_list_base);}static void g_seis_view_axis_traces_resize_event (GSeisViewAxis *self, GtkWidget *seis_view_gl, GSeisViewDataVisibility *data_visibility) { GSeisViewAxisTracesPrivate *private = G_SEIS_VIEW_AXIS_TRACES_GET_PRIVATE (G_SEIS_VIEW_AXIS_TRACES (self)); private->redisplay = TRUE;}void g_seis_view_axis_traces_set_values (GSeisViewAxisTraces *axis, GSeisViewAxisTracesFormat format, GArray *values) { GSeisViewAxisTracesPrivate *private = G_SEIS_VIEW_AXIS_TRACES_GET_PRIVATE (axis); if (private->rendering_mutex) g_mutex_lock (private->rendering_mutex); private->str_values = NULL; if (private->values) g_array_free (private->values, TRUE); private->format = format; if (G_SEIS_VIEW_AXIS_TRACES_INTEGER == private->format) { private->values = g_array_sized_new (FALSE, FALSE, sizeof (gint32), values->len); g_array_append_vals (private->values, &(g_array_index (values, gint32, 0)), values->len); } else { private->values = g_array_sized_new (FALSE, FALSE, sizeof (gdouble), values->len); g_array_append_vals (private->values, &(g_array_index (values, gdouble, 0)), values->len); } if (private->rendering_mutex) g_mutex_unlock (private->rendering_mutex); g_object_notify (G_OBJECT (axis), "values");}void g_seis_view_axis_traces_set_str_values (GSeisViewAxisTraces *axis, GPtrArray *str_values) { GSeisViewAxisTracesPrivate *private = G_SEIS_VIEW_AXIS_TRACES_GET_PRIVATE (axis); if (private->rendering_mutex) g_mutex_lock (private->rendering_mutex); if (private->values) { g_array_free (private->values, TRUE); private->values = NULL; } private->str_values = str_values; if (private->rendering_mutex) g_mutex_unlock (private->rendering_mutex); g_object_notify (G_OBJECT (axis), "str_values");}void g_seis_view_axis_traces_set_precision (GSeisViewAxisTraces *axis, guint8 precision) { GSeisViewAxisTracesPrivate *private = G_SEIS_VIEW_AXIS_TRACES_GET_PRIVATE (axis); if (private->rendering_mutex) g_mutex_lock (private->rendering_mutex); private->precision = precision; if (private->precision > 6) private->precision = 6; if (private->rendering_mutex) g_mutex_unlock (private->rendering_mutex); g_object_notify (G_OBJECT (axis), "precision");}void g_seis_view_axis_traces_set_font (GSeisViewAxisTraces *axis, const gchar *font_name) { GSeisViewAxisTracesPrivate *private = G_SEIS_VIEW_AXIS_TRACES_GET_PRIVATE (axis); if (private->rendering_mutex) g_mutex_lock (private->rendering_mutex); if (private->font_name) g_free (private->font_name); private->font_name = g_strdup (font_name); private->rebuild_font = TRUE; if (private->font_desc) pango_font_description_free (private->font_desc); private->font_desc = pango_font_description_from_string (private->font_name); if (private->rendering_mutex) g_mutex_unlock (private->rendering_mutex); g_object_notify (G_OBJECT (axis), "font");}void g_seis_view_axis_traces_set_fg_color (GSeisViewAxisTraces *axis, const GSeisColor *fg_color) { GSeisViewAxisTracesPrivate *private = G_SEIS_VIEW_AXIS_TRACES_GET_PRIVATE (axis); if (private->rendering_mutex) g_mutex_lock (private->rendering_mutex); private->fg_color.red = fg_color->red; private->fg_color.green = fg_color->green; private->fg_color.blue = fg_color->blue; if (private->rendering_mutex) g_mutex_unlock (private->rendering_mutex); g_object_notify (G_OBJECT (axis), "fg_color");}void g_seis_view_axis_traces_set_bg_color (GSeisViewAxisTraces *axis, const GSeisColor *bg_color) { GSeisViewAxisTracesPrivate *private = G_SEIS_VIEW_AXIS_TRACES_GET_PRIVATE (axis); if (private->rendering_mutex) g_mutex_lock (private->rendering_mutex); private->bg_color.red = bg_color->red; private->bg_color.green = bg_color->green; private->bg_color.blue = bg_color->blue; if (private->rendering_mutex) g_mutex_unlock (private->rendering_mutex); g_object_notify (G_OBJECT (axis), "bg_color");}static void g_seis_view_axis_traces_reshape (GSeisViewAxis *axis, GtkWidget *seis_view_gl) { GSeisViewAxisTracesPrivate *private = G_SEIS_VIEW_AXIS_TRACES_GET_PRIVATE (G_SEIS_VIEW_AXIS_TRACES (axis)); gchar gbuffer[G_ASCII_DTOSTR_BUF_SIZE]; gint16 label_min_value_strlen, label_max_value_strlen; if (private->rendering_mutex) g_mutex_lock (private->rendering_mutex); if (G_SEIS_VIEW_AXIS_TRACES_INTEGER == private->format) g_snprintf (private->gformat, G_ASCII_DTOSTR_BUF_SIZE, "%%%s", G_GINT32_FORMAT); else g_snprintf (private->gformat, G_ASCII_DTOSTR_BUF_SIZE, "%%.%"G_GUINT32_FORMAT"f", (guint32)private->precision); if (GTK_WIDGET_REALIZED (seis_view_gl)) { PangoLayout *layout; if (private->values) { if (G_SEIS_VIEW_AXIS_TRACES_INTEGER == private->format) g_snprintf (gbuffer, G_ASCII_DTOSTR_BUF_SIZE, private->gformat, g_array_index (private->values, gint32, 0)); else g_ascii_formatd (gbuffer, G_ASCII_DTOSTR_BUF_SIZE, private->gformat, g_array_index (private->values, gdouble, 0)); for (label_min_value_strlen = 0; gbuffer[label_min_value_strlen] != '\0'; label_min_value_strlen++); if (G_SEIS_VIEW_AXIS_TRACES_INTEGER == private->format) g_snprintf (gbuffer, G_ASCII_DTOSTR_BUF_SIZE, private->gformat, g_array_index (private->values, gint32, private->values->len - 1)); else g_ascii_formatd (gbuffer, G_ASCII_DTOSTR_BUF_SIZE, private->gformat, g_array_index (private->values, gdouble, private->values->len - 1)); for (label_max_value_strlen = 0; gbuffer[label_max_value_strlen] != '\0'; label_max_value_strlen++); if (label_min_value_strlen > label_max_value_strlen) { if (G_SEIS_VIEW_AXIS_TRACES_INTEGER == private->format) g_snprintf (gbuffer, G_ASCII_DTOSTR_BUF_SIZE, private->gformat, g_array_index (private->values, gint32, 0)); else g_ascii_formatd (gbuffer, G_ASCII_DTOSTR_BUF_SIZE, private->gformat, g_array_index (private->values, gdouble, 0)); private->label_max_strlen = label_min_value_strlen; } else private->label_max_strlen = label_max_value_strlen; /* Render max value and get its dimensions in pixels */ layout = gtk_widget_create_pango_layout (seis_view_gl, gbuffer); pango_layout_set_font_description (layout, private->font_desc); pango_layout_get_pixel_size (layout, &private->text_width_screen, &private->text_height_screen); g_object_unref (layout);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -