gpkplotting.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:8k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. #ifdef HAVEGTK
  2. #include "gpkplotting.h"
  3. #include "string.h"
  4. static gint num_plotwindows = 0;
  5. static gint max_plotwindows = 10;
  6. static GdkPixmap *pixmaps[10];
  7. static GtkWidget *pixmapboxes[10];
  8. /* compute a gdkcolor */
  9. void setcolor(GtkWidget *widget, GdkColor *color, gint red,gint green,gint blue)
  10. {
  11.   /* colors in GdkColor are taken from 0 to 65535, not 0 to 255.    */
  12.   color->red = red * (65535/255);
  13.   color->green = green * (65535/255);
  14.   color->blue = blue * (65535/255);
  15.   color->pixel = (gulong)(color->red*65536 + color->green*256 + color->blue);
  16.   /* find closest in colormap, if needed */
  17.   gdk_color_alloc(gtk_widget_get_colormap(widget),color);
  18. }
  19. void gpk_redraw(GdkPixmap *pixmap, GtkWidget *pixmapbox)
  20. {
  21.   /* redraw the entire pixmap */
  22.   gdk_draw_pixmap(pixmapbox->window,
  23.   pixmapbox->style->fg_gc[GTK_WIDGET_STATE (pixmapbox)],
  24.   pixmap,0,0,0,0,
  25.   pixmapbox->allocation.width,
  26.   pixmapbox->allocation.height);
  27. }
  28. static GdkPixmap **findpixmap(GtkWidget *widget)
  29. {
  30.   int i;
  31.   for (i=0; i<num_plotwindows  && widget != pixmapboxes[i] ; i++);
  32.   if (i>=num_plotwindows) {
  33.     g_print("findpixmap(): bad argument widget n");
  34.     return NULL;
  35.   }
  36.   return &pixmaps[i];
  37. }
  38. void gpk_graph_draw(GtkWidget *widget,               /* plot on this widged */
  39.    int n,                           /* number of data points */
  40.    gdouble *xcord, gdouble *ycord,  /* data */
  41.    gdouble xmn,gdouble ymn,         /* coordinates of corners */
  42.    gdouble xmx,gdouble ymx,
  43.                    int clear,                       /* clear old plot first */
  44.    char *title,                     /* add a title (only if clear=1) */
  45.                    GdkColor *color)     
  46. {
  47.   GdkPixmap **ppixmap;
  48.   GdkPoint *points;
  49.   int i;
  50.   gint16 width,height;
  51.   GdkFont *fixed_font;
  52.   GdkGC *gc;
  53.   gc = gdk_gc_new(widget->window);
  54.   gdk_gc_set_foreground(gc, color);
  55.   if ((ppixmap=findpixmap(widget))) {
  56.     width = widget->allocation.width;
  57.     height = widget->allocation.height;
  58.     if (clear) {
  59.       /* white background */
  60.       gdk_draw_rectangle (*ppixmap,
  61.   widget->style->white_gc,
  62.   TRUE,0, 0,width,height);
  63.       /* title */
  64. #ifndef _WIN32
  65.       fixed_font = gdk_font_load ("-misc-fixed-medium-r-*-*-*-100-*-*-*-*-*-*");
  66. #else
  67.       fixed_font = gdk_font_load ("-misc-fixed-large-r-*-*-*-100-*-*-*-*-*-*");
  68. #endif
  69.       gdk_draw_text (*ppixmap,fixed_font,
  70.      widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
  71.      0,10,title,strlen(title));
  72.     }
  73.       
  74.     points = g_malloc(n*sizeof(GdkPoint));
  75.     for (i=0; i<n ; i++) {
  76.       points[i].x =.5+  ((xcord[i]-xmn)*(width-1)/(xmx-xmn));
  77.       points[i].y =.5+  ((ycord[i]-ymx)*(height-1)/(ymn-ymx));
  78.     }
  79.     gdk_draw_lines(*ppixmap,gc,points,n);
  80.     g_free(points);
  81.     gpk_redraw(*ppixmap,widget);
  82.   }
  83.   gdk_gc_destroy(gc);
  84. }
  85. void gpk_rectangle_draw(GtkWidget *widget,              /* plot on this widged */
  86. gdouble *xcord, gdouble *ycord, /* corners */
  87. gdouble xmn,gdouble ymn,        /* coordinates of corners */
  88. gdouble xmx,gdouble ymx,
  89. GdkColor *color)
  90. {
  91.   GdkPixmap **ppixmap;
  92.   GdkPoint points[2];
  93.   int i;
  94.   gint16 width,height;
  95.   GdkGC *gc;
  96.   gc = gdk_gc_new(widget->window);
  97.   gdk_gc_set_foreground(gc, color);
  98.   if ((ppixmap=findpixmap(widget))) {
  99.     width = widget->allocation.width;
  100.     height = widget->allocation.height;
  101.     for (i=0; i<2 ; i++) {
  102.       points[i].x =.5+  ((xcord[i]-xmn)*(width-1)/(xmx-xmn));
  103.       points[i].y =.5+  ((ycord[i]-ymx)*(height-1)/(ymn-ymx));
  104.     }
  105.     width=points[1].x-points[0].x + 1;
  106.     height=points[1].y-points[0].y + 1;
  107.     gdk_draw_rectangle(*ppixmap,gc,TRUE,
  108.        points[0].x,points[0].y,width,height);
  109.     gpk_redraw(*ppixmap,widget);
  110.   }
  111.   gdk_gc_destroy(gc);
  112. }
  113. void gpk_bargraph_draw(GtkWidget *widget,           /* plot on this widged */
  114.    int n,                           /* number of data points */
  115.    gdouble *xcord, gdouble *ycord,  /* data */
  116.    gdouble xmn,gdouble ymn,         /* coordinates of corners */
  117.    gdouble xmx,gdouble ymx,
  118.                    int clear,                       /* clear old plot first */
  119.    char *title,                     /* add a title (only if clear=1) */
  120.                    int barwidth,                    /* bar width. 0=compute based on window size */    
  121.                    GdkColor *color)     
  122. {
  123.   GdkPixmap **ppixmap;
  124.   GdkPoint points[2];
  125.   int i;
  126.   gint16 width,height,x,y,barheight;
  127.   GdkFont *fixed_font;
  128.   GdkGC *gc;
  129.   gc = gdk_gc_new(widget->window);
  130.   gdk_gc_set_foreground(gc, color);
  131.   if ((ppixmap=findpixmap(widget))) {
  132.     width = widget->allocation.width;
  133.     height = widget->allocation.height;
  134.     if (clear) {
  135.       /* white background */
  136.       gdk_draw_rectangle (*ppixmap,
  137.   widget->style->white_gc,
  138.   TRUE,0, 0,width,height);
  139.       /* title */
  140. #ifndef _WIN32
  141.       fixed_font = gdk_font_load ("-misc-fixed-medium-r-*-*-*-100-*-*-*-*-*-*");
  142. #else
  143.       fixed_font = gdk_font_load ("-misc-fixed-large-r-*-*-*-100-*-*-*-*-*-*");
  144. #endif
  145.       gdk_draw_text (*ppixmap,fixed_font,
  146.      widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
  147.      0,10,title,strlen(title));
  148.     }
  149.       
  150.     for (i=0; i<n ; i++) {
  151.       points[1].x =.5+  ((xcord[i]-xmn)*(width-1)/(xmx-xmn));
  152.       points[1].y =.5+  ((ycord[i]-ymx)*(height-1)/(ymn-ymx));
  153.       points[0].x = points[1].x;
  154.       points[0].y = height-1;
  155.       x = .5+  ((xcord[i]-xmn)*(width-1)/(xmx-xmn));
  156.       y = .5+((ycord[i]-ymx)*(height-1)/(ymn-ymx));
  157.       if (!barwidth) barwidth  = (width/(n+1))-1;
  158.       barwidth = barwidth > 5 ? 5 : barwidth;
  159.       barwidth = barwidth < 1 ? 1 : barwidth;
  160.       barheight = height-1 - y;
  161.       /* gdk_draw_lines(*ppixmap,gc,points,2); */
  162.       gdk_draw_rectangle(*ppixmap,gc,TRUE,x,y,barwidth,barheight);
  163.     }
  164.     gpk_redraw(*ppixmap,widget);
  165.   }
  166.   gdk_gc_destroy(gc);
  167. }
  168. /* Create a new backing pixmap of the appropriate size */
  169. static gint
  170. configure_event (GtkWidget *widget, GdkEventConfigure *event, gpointer data)
  171. {
  172.   GdkPixmap **ppixmap;
  173.   if ((ppixmap=findpixmap(widget))){
  174.     if (*ppixmap) gdk_pixmap_unref(*ppixmap);
  175.     *ppixmap = gdk_pixmap_new(widget->window,
  176.     widget->allocation.width,
  177.     widget->allocation.height,
  178.     -1);
  179.     gdk_draw_rectangle (*ppixmap,
  180. widget->style->white_gc,
  181. TRUE,
  182. 0, 0,
  183. widget->allocation.width,
  184. widget->allocation.height);
  185.   }
  186.   return TRUE;
  187. }
  188. /* Redraw the screen from the backing pixmap */
  189. static gint
  190. expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer data)
  191. {
  192.   GdkPixmap **ppixmap;
  193.   if ((ppixmap=findpixmap(widget))){
  194.     gdk_draw_pixmap(widget->window,
  195.     widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
  196.     *ppixmap,
  197.     event->area.x, event->area.y,
  198.     event->area.x, event->area.y,
  199.     event->area.width, event->area.height);
  200.   }
  201.   return FALSE;
  202. }
  203. GtkWidget *gpk_plot_new(int width, int height)
  204. {
  205.   GtkWidget *pixmapbox;
  206.    
  207.   pixmapbox = gtk_drawing_area_new();
  208.   gtk_drawing_area_size(GTK_DRAWING_AREA(pixmapbox),width,height);
  209.   gtk_signal_connect (GTK_OBJECT (pixmapbox), "expose_event",
  210.       (GtkSignalFunc) expose_event, NULL);
  211.   gtk_signal_connect (GTK_OBJECT(pixmapbox),"configure_event",
  212.       (GtkSignalFunc) configure_event, NULL);
  213.   gtk_widget_set_events (pixmapbox, GDK_EXPOSURE_MASK);
  214.   if (num_plotwindows < max_plotwindows) {
  215.     pixmapboxes[num_plotwindows] = pixmapbox;
  216.     pixmaps[num_plotwindows] = NULL;
  217.     num_plotwindows ++;
  218.   } else {
  219.     g_print("gtk_plotarea_new(): exceeded maximum of 10 plotarea windowsn");
  220.   }
  221.   return pixmapbox;
  222. }
  223. #endif