📄 gtkseisviewgl.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 <gtk/gtk.h>#include <gtk/gtkgl.h>#include <gdk/gdkglglext.h>#include <GL/gl.h>#include <GL/glu.h>#ifdef LINUX#include <GL/glx.h>#endif#include "gseisviewfor.h"#include "gseisviewshaders.h"#include "gtkseisviewgl_marshal.h"#include "gtkseisviewglsl.h"#include "gtkseisviewgl.h"G_DEFINE_TYPE (GtkSeisViewGl, gtk_seis_view_gl, GTK_TYPE_DRAWING_AREA)#define GTK_SEIS_VIEW_GL_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), GTK_TYPE_SEIS_VIEW_GL, GtkSeisViewGlPrivate))typedef enum { GTK_SEIS_VIEW_MSG_BUTTON_EVENT = 1, GTK_SEIS_VIEW_MSG_ENTER_EVENT, GTK_SEIS_VIEW_MSG_LEAVE_EVENT, GTK_SEIS_VIEW_MSG_MOTION_EVENT, GTK_SEIS_VIEW_MSG_SCROLL_EVENT, GTK_SEIS_VIEW_MSG_KEY_EVENT, GTK_SEIS_VIEW_MSG_CALC_DATA_VIS, GTK_SEIS_VIEW_MSG_FREE_CONTEXT, GTK_SEIS_VIEW_MSG_CONFIGURE, GTK_SEIS_VIEW_MSG_REDRAW, GTK_SEIS_VIEW_MSG_REALIZE, GTK_SEIS_VIEW_MSG_SET_PALETTE, GTK_SEIS_VIEW_MSG_SET_AXES_CORNER_COLOR, GTK_SEIS_VIEW_MSG_SET_UNDERLAYER_COLOR, GTK_SEIS_VIEW_MSG_SET_TRACE_COLOR, GTK_SEIS_VIEW_MSG_SET_HIGHLIGHT_COLOR, GTK_SEIS_VIEW_MSG_SET_AXIS, GTK_SEIS_VIEW_MSG_SET_ACTIVE_TOOL, GTK_SEIS_VIEW_MSG_SET_MINMAX_MODE, GTK_SEIS_VIEW_MSG_SET_VA_FILL_MODE, GTK_SEIS_VIEW_MSG_SET_INVERSE_POLARITY, GTK_SEIS_VIEW_MSG_SET_SHOW_CROSS, GTK_SEIS_VIEW_MSG_SET_DISPLAY_MODE, GTK_SEIS_VIEW_MSG_SET_TRACES_SCALE, GTK_SEIS_VIEW_MSG_SET_AGC_USE, GTK_SEIS_VIEW_MSG_SET_GENERATE_WIGGLES, GTK_SEIS_VIEW_MSG_SET_DATA_VIEWPORT, GTK_SEIS_VIEW_MSG_SET_HIGHLIGHT_AREA, GTK_SEIS_VIEW_MSG_SET_SIGNAL_TYPE, GTK_SEIS_VIEW_MSG_SET_COLORING_MODE, GTK_SEIS_VIEW_MSG_SET_DATA, GTK_SEIS_VIEW_MSG_AXIS_REFRESH, GTK_SEIS_VIEW_MSG_RENDER_TO_PIXBUF, GTK_SEIS_VIEW_MSG_SET_SHARED_VIEW} GtkSeisViewGlMessageType;#define MAX_MESSAGE_DATA 80typedef struct _GtkSeisViewGlMessage GtkSeisViewGlMessage;struct _GtkSeisViewGlMessage { GtkSeisViewGlMessageType type; GtkSeisViewGl *seis_view; guint8 data[MAX_MESSAGE_DATA];};enum { PROP_0, PROP_PALETTE, PROP_CORNER_COLOR, PROP_TRACE_COLOR, PROP_UNDERLAYER_COLOR, PROP_HIGHLIGHT_COLOR, PROP_SLOW_NUM, PROP_FAST_NUM, PROP_DISPLAY_MODE, PROP_VA_FILL_MODE, PROP_MINMAX_MODE, PROP_INVERSE_POLARITY, PROP_SHOW_CROSS, PROP_AGC_MODE, PROP_AGC_WINDOW, PROP_GENERATE_WIGGLES, PROP_TRACES_SCALE, PROP_SIGNAL_TYPE, PROP_COLORING_MODE, PROP_SLOW_START_DATA, PROP_SLOW_SIZE_DATA, PROP_FAST_START_DATA, PROP_FAST_SIZE_DATA, PROP_HIGHLIGHT_AREA_START, PROP_HIGHLIGHT_AREA_SIZE, PROP_CAN_RENDER_OFFSCREEN, PROP_CAN_CHANGE_PALETTE_FAST, PROP_HAS_REAL_AMPLITUDES, PROP_SHARED_SEIS_VIEW, PROP_THREADED, PROP_NUM};static gchar *seis_view_properties[PROP_NUM] = { "none", "palette", "corner_color", "trace_color", "underlayer_color", "highlight_color", "slow_num", "fast_num", "display_mode", "va_fill_mode", "min_max_mode", "inverse_polarity", "show_cross", "agc_mode", "agc_window", "generate_wiggles", "traces_scale", "signal_type", "coloring_mode", "slow_start_data", "slow_size_data", "fast_start_data", "fast_size_data", "highlight_area_start", "highlight_area_size", "can_render_offscreen", "can_change_palette_fast", "has_real_amplitudes", "shared_seis_view", "threaded"};typedef struct _GtkSeisViewGlPropertyNotify GtkSeisViewGlPropertyNotify;struct _GtkSeisViewGlPropertyNotify { GtkSeisViewGl *seis_view_gl; const gchar *property_name;};typedef enum { GTK_SEIS_VIEW_TEX_PIXEL_MAP, GTK_SEIS_VIEW_TEX_PALETTED, GTK_SEIS_VIEW_TEX_FRAG_COLOR} GtkSeisViewTexColorMode;typedef struct _GtkSeisViewGlPrivate GtkSeisViewGlPrivate;struct _GtkSeisViewGlPrivate { GdkGLConfig *gl_config; GSeisPalette *palette; GSeisColor corner_color; GSeisColor trace_color; GSeisColor underlayer_color; GSeisColor highlight_color; guint32 slow_num; /* Number of original samples in the slow direction */ guint32 fast_num; /* Number of original samples in the fast direction */ guint32 tex_size; /* Texture dimension */ guint32 tex_slow_num; /* Number of textures in the slow dimension */ guint32 tex_fast_num; /* Number of textures in the fast dimension */ GLuint *tex_id; /* OpenGL textures' IDs */ GLint max_tex_size; /* Maximum texture width/height */ GLuint wiggle_list_base; /* Display list for wiggles */ GLuint va_list_neg_base; /* Display list for variable area - negative fill*/ GLuint va_list_pos_base; /* Display list for variable area - positive fill */ GLdouble ortho_left_x; /* Object coordinate system settings */ GLdouble ortho_top_y; GLdouble ortho_width; GLdouble ortho_height; GLdouble top_margin_size; /* Margin sizes in the object coordinate system */ GLdouble bottom_margin_size; GLdouble left_margin_size; GLdouble right_margin_size; guint16 top_margin_pixels; /* Margin sizes in the screen coordinate system */ guint16 bottom_margin_pixels; guint16 left_margin_pixels; guint16 right_margin_pixels; GtkSeisViewDisplayMode display_mode; GtkSeisViewVAFill va_fill_mode; GtkSeisViewMinMax minmax_mode; gboolean inverse_polarity; gboolean show_cross; gboolean use_agc; gfloat agc_window; GdkGL_GL_VERSION_1_3 *gl13; /* OpenGL 1.3 extensions */ GdkGL_GL_ARB_vertex_buffer_object *vbo; /* Vertex buffer object extension */ GdkGL_GL_EXT_framebuffer_object *fbo; /* Frame buffer object extension */ GdkGL_GL_EXT_paletted_texture *pal_tex; /* Paletted textures extension */ GdkGL_GL_ARB_shader_objects *shaders; /* GL Shader Language extension */ gboolean sgis_mipmaps; /* TRUE - GL_SGIS_generate_mipmap is supported */ gboolean rectangle_textures; /* TRUE - GL_ARB_texture_rectangle is supported */ gboolean offscreen_rendering; /* TRUE - can render offscreen */ gboolean fast_palette_change; /* TRUE - can change palettes without data reload */ GtkSeisViewTexColorMode tex_color_mode; GLenum tex_palette_program; GLenum tex_palette_fragment_shader; GLint seis_tex_uniform; GLint palette_tex_uniform; GLuint tex_pal_id; GLuint *traces_wiggle_vbo; /* VBOs for wiggle vertices */ GLuint *traces_va_pos_vbo; /* VBOs for positive area vertices */ GLuint *traces_va_neg_vbo; /* VBOs for negative area vertices */ GLsizei *wiggle_num; /* Number of vertices in a wiggle VBO for each trace */ GLsizei *va_pos_num; /* Number of vertices in a positive va VBO for each trace */ GLsizei *va_neg_num; /* Number of vertices in a negative va VBO for each trace */ gboolean generate_wiggles; gboolean has_wiggles; GdkGLContext *shared_context; GtkSeisViewGl *shared_seis_view; gboolean is_slave; /* TRUE - takes the context from shared_seis_view, FALSE - gives own context to it */ gboolean is_threaded; gfloat trace_scale; /* [0.5 - 2] - how much each trace is scaled horizontally */ GSeisViewTool *active_tool; /* Current active tool processing mouse actions in the drawing area */ GSeisViewAxis *axes[G_SEIS_VIEW_AXES_TYPES_NUM]; /* Array of axes */ gdouble hlight_start_data; /* Highlighted area start in the data space [0; 1] */ gdouble hlight_size_data; /* Highlighted area size in the data space [0; 1] */ GSeisViewDataVisibility data_vis; /* Information about visible part of data */ gboolean recalc_data_vis; guint last_trace_step_index; guint last_trace_start_index; GtkSeisViewSignal signal_type; GtkSeisViewColoring coloring_mode; gboolean data_is_set; gboolean reset_palette; gboolean cross_is_drawn; GThread *rendering_thread; GMutex *dataccess_mutex; GAsyncQueue *destroy_queue; GAsyncQueue *message_queue; GMutex *message_mutex; GPrivate *message_key; GArray *messages; GtkSeisViewGlPropertyNotify notify_data[PROP_NUM];};GtkWidget* gtk_seis_view_gl_new (void) { return g_object_new (GTK_TYPE_SEIS_VIEW_GL, "threaded", FALSE, NULL);}GtkWidget* gtk_seis_view_gl_new_threaded (void) { return g_object_new (GTK_TYPE_SEIS_VIEW_GL, "threaded", TRUE, NULL);}GtkWidget* gtk_seis_view_gl_new_shared (GtkSeisViewGl *shared_seis_view_gl) { return g_object_new (GTK_TYPE_SEIS_VIEW_GL, "shared-seis-view", shared_seis_view_gl, NULL);}static gboolean gtk_seis_view_gl_property_notify_idle (GtkSeisViewGlPropertyNotify *notify_data) { g_object_notify (G_OBJECT (notify_data->seis_view_gl), notify_data->property_name); return FALSE;}static void gtk_seis_view_gl_property_notify (GtkSeisViewGl *self, guint property_num) { GtkSeisViewGlPrivate *private = GTK_SEIS_VIEW_GL_GET_PRIVATE (self); if (private->message_queue && g_private_get (private->message_key))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -