⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gtkseisviewgl.c

📁 segy 显示程序!希望能给正在做这部分朋友提供一部分资料
💻 C
📖 第 1 页 / 共 5 页
字号:
/*  * 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 + -