📄 gseisviewaxistraces.c
字号:
/* * GTKSEISVIEWGL - Library for rendering of 2D seismic data * * Copyright (C) 2006 Vladimir Bashkardin * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more av. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: Vladimir Bashkardin <vovizmus@users.sourceforge.net> */#include <math.h>#include <GL/gl.h>#include <gtk/gtkgl.h>#include "gseisviewaxistraces.h"#include "gtkseisviewgl.h"G_DEFINE_TYPE (GSeisViewAxisTraces, g_seis_view_axis_traces, G_SEIS_TYPE_VIEW_AXIS)#define G_SEIS_VIEW_AXIS_TRACES_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), G_SEIS_TYPE_VIEW_AXIS_TRACES, GSeisViewAxisTracesPrivate))typedef struct _GSeisViewAxisTracesPrivate GSeisViewAxisTracesPrivate;struct _GSeisViewAxisTracesPrivate { GSeisViewAxisTracesFormat format; PangoFontDescription *font_desc; gchar *font_name; guint text_width_screen; guint text_height_screen; GSeisColor fg_color; GSeisColor bg_color; GLuint font_list_base; GLuint font_list_start; GLuint font_list_end; gchar gformat[G_ASCII_DTOSTR_BUF_SIZE]; gint16 label_max_strlen; guint8 precision; GArray *values; GPtrArray *str_values; GLuint display_list_base; gboolean redisplay; gboolean rebuild_font; gboolean is_threaded; GMutex *rendering_mutex;};static void g_seis_view_axis_traces_delete_render_list (GSeisViewAxisTraces *self, GtkWidget *seis_view_gl, gboolean context_started) { GSeisViewAxisTracesPrivate *private = G_SEIS_VIEW_AXIS_TRACES_GET_PRIVATE (self); GdkGLContext *gl_context; GdkGLDrawable *gl_drawable; if (private->display_list_base != 0) { if (FALSE == context_started) { if (GTK_WIDGET_REALIZED (seis_view_gl)) { if (private->is_threaded) gdk_threads_enter (); gl_context = gtk_widget_get_gl_context (seis_view_gl); gl_drawable = gtk_widget_get_gl_drawable (seis_view_gl); if (gdk_gl_drawable_gl_begin (gl_drawable, gl_context)) { glDeleteLists (private->display_list_base, 1); gdk_gl_drawable_gl_end (gl_drawable); } if (private->is_threaded) gdk_threads_leave (); } } else glDeleteLists (private->display_list_base, 1); private->display_list_base = 0; private->redisplay = TRUE; }}static void g_seis_view_axis_traces_delete_font_list (GSeisViewAxisTraces *self, GtkWidget *seis_view_gl, gboolean context_started) { GSeisViewAxisTracesPrivate *private = G_SEIS_VIEW_AXIS_TRACES_GET_PRIVATE (self); GdkGLContext *gl_context; GdkGLDrawable *gl_drawable; if (private->font_list_base != 0) { if (FALSE == context_started) { if (GTK_WIDGET_REALIZED (seis_view_gl)) { if (private->is_threaded) gdk_threads_enter (); gl_context = gtk_widget_get_gl_context (seis_view_gl); gl_drawable = gtk_widget_get_gl_drawable (seis_view_gl); if (gdk_gl_drawable_gl_begin (gl_drawable, gl_context)) { glDeleteLists (private->font_list_base, private->font_list_end + 1); gdk_gl_drawable_gl_end (gl_drawable); } if (private->is_threaded) gdk_threads_leave (); } } else glDeleteLists (private->font_list_base, private->font_list_end + 1); private->font_list_base = 0; private->rebuild_font = TRUE; }}static void g_seis_view_axis_traces_create_font_list (GSeisViewAxisTraces *self, GtkWidget *seis_view_gl) { GSeisViewAxisTracesPrivate *private = G_SEIS_VIEW_AXIS_TRACES_GET_PRIVATE (self); private->font_list_base = glGenLists (private->font_list_end + 1); gdk_gl_font_use_pango_font (private->font_desc, private->font_list_start, private->font_list_end, private->font_list_base + private->font_list_start); private->rebuild_font = FALSE; private->redisplay = TRUE;}static void g_seis_view_axis_traces_attach_notify (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->rebuild_font = TRUE; private->redisplay = TRUE; private->is_threaded = gtk_seis_view_gl_is_threaded (GTK_SEIS_VIEW_GL (seis_view_gl)); if (private->is_threaded && NULL == private->rendering_mutex) private->rendering_mutex = g_mutex_new ();}static void g_seis_view_axis_traces_detach_notify (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->is_threaded = gtk_seis_view_gl_is_threaded (GTK_SEIS_VIEW_GL (seis_view_gl)); g_seis_view_axis_traces_delete_render_list (G_SEIS_VIEW_AXIS_TRACES (self), seis_view_gl, FALSE); g_seis_view_axis_traces_delete_font_list (G_SEIS_VIEW_AXIS_TRACES (self), seis_view_gl, FALSE);}static void g_seis_view_axis_traces_data_viewport_change (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;}static void g_seis_view_axis_traces_redraw_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)); gdouble slow_pixel_to_object_scale; gdouble fast_pixel_to_object_scale; gchar gbuffer[G_ASCII_DTOSTR_BUF_SIZE]; gchar *label_str = &gbuffer[0]; gdouble text_width_object, text_height_object; /* Label dimensions in the object space */ gdouble first_value_index, last_value_index; /* Visible values of the data */ gdouble start_label_index, end_label_index, labels_step; /* Visible labels parameters */ gdouble start_label_object, labels_step_object; /* Labels parameters in the object space */ gdouble fast_start_object; /* Actual starting position of the axis - depends on the type */ gdouble slow_start_data, slow_size_data; /* Actual starting position of the data */ gdouble tick_size_object, first_glyph_shift; guint32 labels_num, i; gint16 label_strlen; gdouble value_to_object_scale; /* No bottom or top positions */ if (self->type > G_SEIS_VIEW_AXIS_BOTTOM) return; if (private->rebuild_font && private->font_desc) { if (private->rendering_mutex) g_mutex_lock (private->rendering_mutex); g_seis_view_axis_traces_delete_font_list (G_SEIS_VIEW_AXIS_TRACES (self), seis_view_gl, TRUE); g_seis_view_axis_traces_create_font_list (G_SEIS_VIEW_AXIS_TRACES (self), seis_view_gl); if (private->rendering_mutex) g_mutex_unlock (private->rendering_mutex); } glColor3f (private->bg_color.red / (gfloat)G_MAXUINT16, private->bg_color.green / (gfloat)G_MAXUINT16, private->bg_color.blue / (gfloat)G_MAXUINT16); if (G_SEIS_VIEW_AXIS_TOP == self->type) { glBegin (GL_QUADS); glVertex2f (data_visibility->slow_start_object, 0); glVertex2f (data_visibility->slow_start_object + data_visibility->slow_size_object, 0); glVertex2f (data_visibility->slow_start_object + data_visibility->slow_size_object, data_visibility->fast_start_object); glVertex2f (data_visibility->slow_start_object, data_visibility->fast_start_object); glEnd (); } else { glBegin (GL_QUADS); glVertex2f (data_visibility->slow_start_object, data_visibility->fast_start_object + data_visibility->fast_size_object); glVertex2f (data_visibility->slow_start_object + data_visibility->slow_size_object, data_visibility->fast_start_object + data_visibility->fast_size_object); glVertex2f (data_visibility->slow_start_object + data_visibility->slow_size_object, data_visibility->fast_full_size_object); glVertex2f (data_visibility->slow_start_object, data_visibility->fast_full_size_object); glEnd (); } glColor3f (private->fg_color.red / (gfloat)G_MAXUINT16, private->fg_color.green / (gfloat)G_MAXUINT16, private->fg_color.blue / (gfloat)G_MAXUINT16); if (private->redisplay && (private->values || private->str_values)) { if (private->rendering_mutex) g_mutex_lock (private->rendering_mutex); if (private->display_list_base) glDeleteLists (private->display_list_base, 1); guint values_num = private->values ? private->values->len : private->str_values->len; slow_pixel_to_object_scale = data_visibility->slow_size_object / (gdouble)data_visibility->slow_size_screen; fast_pixel_to_object_scale = data_visibility->fast_size_object / (gdouble)data_visibility->fast_size_screen; slow_start_data = data_visibility->slow_start_data - 0.5 / (gdouble)(values_num); slow_size_data = data_visibility->slow_size_data; /* Dimensions in the object space */ text_width_object = private->text_width_screen * slow_pixel_to_object_scale; text_height_object = private->text_height_screen * fast_pixel_to_object_scale; /* Variables defining positions of the labels */ if (self->type == G_SEIS_VIEW_AXIS_BOTTOM) { fast_start_object = data_visibility->fast_start_object + data_visibility->fast_size_object; tick_size_object = -(gint)(private->text_height_screen * 0.4) * fast_pixel_to_object_scale; first_glyph_shift = 0.575; } else { fast_start_object = data_visibility->fast_start_object; tick_size_object = (gint)(private->text_height_screen * 0.4) * fast_pixel_to_object_scale; first_glyph_shift = 0; } first_value_index = values_num * slow_start_data; last_value_index = values_num * (slow_start_data + slow_size_data); value_to_object_scale = data_visibility->slow_size_object / (last_value_index - first_value_index); start_label_index = (gint)first_value_index; while (start_label_index < first_value_index) start_label_index += 1; end_label_index = (gint)last_value_index; while (end_label_index > last_value_index) end_label_index -= 1; labels_num = end_label_index - start_label_index + 1; labels_step = 1; labels_step_object = labels_step * value_to_object_scale; /* Calculate appropriate distance between labels */ while (labels_step_object < text_width_object * 1.5 || labels_num > values_num) { labels_step += 1; start_label_index = ((gint)(first_value_index / labels_step)) * labels_step;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -