📄 gseisviewaxisz.c
字号:
start_label += labels_step; end_label = ((gint)(last_value / labels_step)) * labels_step; while (end_label > last_value) end_label -= labels_step; labels_num = (end_label - start_label) / labels_step + 1; labels_step_object = labels_step * value_to_object_scale; for (;;) { if (ten_factor < 2.0) ten_factor = 2.0; else if (ten_factor < 2.4) ten_factor = 2.5; else if (ten_factor < 4.0) ten_factor = 5.0; else { power_of_ten++; ten_powered = pow (10, power_of_ten); ten_factor = 1.0; } labels_residue = ten_powered * ten_factor - (gint)(ten_powered * ten_factor); labels_precision = 0; while (labels_residue - (gint)(labels_residue)) { labels_precision++; labels_residue *= 10.0; } if (G_SEIS_VIEW_AXIS_Z_FLOAT == private->format && labels_precision <= private->precision) break; else if (0 == labels_precision) break; } } start_label_object = data_visibility->fast_start_object + (start_label - first_value) * 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 */ gdouble preceding_label = start_label - labels_step; if ((preceding_label >= private->min_value && preceding_label <= private->max_value) || (preceding_label <= private->min_value && preceding_label >= private->max_value)) { if (G_SEIS_VIEW_AXIS_Z_INTEGER == private->format) g_snprintf (gbuffer, G_ASCII_DTOSTR_BUF_SIZE, private->gformat, (gint)(start_label - labels_step)); else g_ascii_formatd (gbuffer, G_ASCII_DTOSTR_BUF_SIZE, private->gformat, start_label - labels_step); for (label_strlen = 0; gbuffer[label_strlen] != '\0'; label_strlen++); if (self->type == G_SEIS_VIEW_AXIS_RIGHT) glRasterPos2f (slow_start_object - tick_size_object + margin_object, start_label_object); else glRasterPos2f (margin_object + text_width_object * (private->label_max_strlen - label_strlen) / (gdouble)private->label_max_strlen, start_label_object); glBitmap (0, 0, 0, 0, 0, labels_step_object / fast_pixel_to_object_scale + private->text_height_screen / -4.0, NULL); glCallLists (label_strlen, GL_UNSIGNED_BYTE, (GLubyte*)gbuffer); } /* All visible labels */ for (i = 0; i < labels_num; i++) { if (G_SEIS_VIEW_AXIS_Z_INTEGER == private->format) g_snprintf (gbuffer, G_ASCII_DTOSTR_BUF_SIZE, private->gformat, (gint)(start_label + i * labels_step)); else g_ascii_formatd (gbuffer, G_ASCII_DTOSTR_BUF_SIZE, private->gformat, start_label + i * labels_step); /* Text length */ for (label_strlen = 0; gbuffer[label_strlen] != '\0'; label_strlen++); if (self->type == G_SEIS_VIEW_AXIS_RIGHT) glRasterPos2f (slow_start_object - tick_size_object + margin_object, start_label_object + i * labels_step_object); else glRasterPos2f (margin_object + text_width_object * (private->label_max_strlen - label_strlen) / (gdouble)private->label_max_strlen, start_label_object + i * labels_step_object); glBitmap (0, 0, 0, 0, 0, private->text_height_screen / -4.0, NULL); glCallLists (label_strlen, GL_UNSIGNED_BYTE, (GLubyte*)gbuffer); /* Tick */ glBegin (GL_LINES); glVertex2f (slow_start_object - tick_size_object, start_label_object + i * labels_step_object); glVertex2f (slow_start_object, start_label_object + i * labels_step_object); glEnd (); } /* Trailing label - might be visible partially */ gdouble trailing_label = start_label + labels_num * labels_step; if ((trailing_label <= private->max_value && trailing_label >= private->min_value) || (trailing_label >= private->max_value && trailing_label <= private->min_value)) { if (G_SEIS_VIEW_AXIS_Z_INTEGER == private->format) g_snprintf (gbuffer, G_ASCII_DTOSTR_BUF_SIZE, private->gformat, (gint)(start_label + labels_num * labels_step)); else g_ascii_formatd (gbuffer, G_ASCII_DTOSTR_BUF_SIZE, private->gformat, start_label + labels_num * labels_step); for (label_strlen = 0; gbuffer[label_strlen] != '\0'; label_strlen++); if (self->type == G_SEIS_VIEW_AXIS_RIGHT) glRasterPos2f (slow_start_object - tick_size_object + margin_object, start_label_object + (labels_num - 1) * labels_step_object); else glRasterPos2f (margin_object + text_width_object * (private->label_max_strlen - label_strlen) / (gdouble)private->label_max_strlen, start_label_object + (labels_num - 1) * labels_step_object); glBitmap (0, 0, 0, 0, 0, -labels_step_object / fast_pixel_to_object_scale + private->text_height_screen / -4.0, NULL); glCallLists (label_strlen, GL_UNSIGNED_BYTE, (GLubyte*)gbuffer); } /* Border line */ glLineWidth (2); glBegin (GL_LINES); glVertex2f (slow_start_object, data_visibility->fast_start_object); glVertex2f (slow_start_object, data_visibility->fast_start_object + data_visibility->fast_size_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_z_resize_event (GSeisViewAxis *self, GtkWidget *seis_view_gl, GSeisViewDataVisibility *data_visibility) { GSeisViewAxisZPrivate *private = G_SEIS_VIEW_AXIS_Z_GET_PRIVATE (G_SEIS_VIEW_AXIS_Z (self)); private->redisplay = TRUE;}void g_seis_view_axis_z_set_min_max (GSeisViewAxisZ *axis, gdouble min_value, gdouble values_step, guint32 values_num) { GSeisViewAxisZPrivate *private = G_SEIS_VIEW_AXIS_Z_GET_PRIVATE (axis); if (private->rendering_mutex) g_mutex_lock (private->rendering_mutex); private->min_value = min_value; private->values_step = values_step; private->values_num = values_num; private->max_value = min_value + (values_num - 1) * values_step; if (private->rendering_mutex) g_mutex_unlock (private->rendering_mutex);}void g_seis_view_axis_z_set_format (GSeisViewAxisZ *axis, GSeisViewAxisZFormat format) { GSeisViewAxisZPrivate *private = G_SEIS_VIEW_AXIS_Z_GET_PRIVATE (axis); if (private->rendering_mutex) g_mutex_lock (private->rendering_mutex); private->format = format; if (private->rendering_mutex) g_mutex_unlock (private->rendering_mutex);}void g_seis_view_axis_z_set_precision (GSeisViewAxisZ *axis, guint8 precision) { GSeisViewAxisZPrivate *private = G_SEIS_VIEW_AXIS_Z_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);}void g_seis_view_axis_z_set_font (GSeisViewAxisZ *axis, const gchar *font_name) { GSeisViewAxisZPrivate *private = G_SEIS_VIEW_AXIS_Z_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); if (private->font_desc) pango_font_description_free (private->font_desc); private->rebuild_font = TRUE; private->font_desc = pango_font_description_from_string (private->font_name); if (private->rendering_mutex) g_mutex_unlock (private->rendering_mutex);}void g_seis_view_axis_z_set_fg_color (GSeisViewAxisZ *axis, const GSeisColor *fg_color) { GSeisViewAxisZPrivate *private = G_SEIS_VIEW_AXIS_Z_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_z_set_bg_color (GSeisViewAxisZ *axis, const GSeisColor *bg_color) { GSeisViewAxisZPrivate *private = G_SEIS_VIEW_AXIS_Z_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_z_reshape (GSeisViewAxis *axis, GtkWidget *seis_view_gl) { GSeisViewAxisZPrivate *private = G_SEIS_VIEW_AXIS_Z_GET_PRIVATE (G_SEIS_VIEW_AXIS_Z (axis)); gchar gbuffer[G_ASCII_DTOSTR_BUF_SIZE]; guint max_text_width_screen = 0, max_text_height_screen = 0; guint text_width_screen = 0, text_height_screen = 0; gint16 label_strlen = 0, label_max_strlen = 0; gfloat value; if (private->rendering_mutex) g_mutex_lock (private->rendering_mutex); if (G_SEIS_VIEW_AXIS_Z_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); gbuffer[0] = '\0'; if (GTK_WIDGET_REALIZED (seis_view_gl)) { PangoLayout *layout = gtk_widget_create_pango_layout (seis_view_gl, gbuffer); pango_layout_set_width (layout, -1); pango_layout_set_indent (layout, 0); pango_layout_set_spacing (layout, 0); pango_layout_set_justify (layout, FALSE); pango_layout_set_font_description (layout, private->font_desc); /* Render values and get their dimensions in pixels */ for (value = private->min_value; value <= private->max_value; value += private->values_step) { if (G_SEIS_VIEW_AXIS_Z_INTEGER == private->format) g_snprintf (gbuffer, G_ASCII_DTOSTR_BUF_SIZE, private->gformat, (gint)value); else g_ascii_formatd (gbuffer, G_ASCII_DTOSTR_BUF_SIZE, private->gformat, value); for (label_strlen = 0; gbuffer[label_strlen] != '\0'; label_strlen++); if (label_strlen > label_max_strlen) label_max_strlen = label_strlen; pango_layout_set_text (layout, gbuffer, -1); pango_layout_get_pixel_size (layout, &text_width_screen, &text_height_screen); if (text_width_screen > max_text_width_screen) max_text_width_screen = text_width_screen; if (text_height_screen > max_text_height_screen) max_text_height_screen = text_height_screen; } private->label_max_strlen = label_max_strlen; private->text_width_screen = max_text_width_screen; private->text_height_screen = max_text_height_screen; g_object_unref (layout);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -