The R Project SVN R

Rev

Rev 27117 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 27117 Rev 27236
Line 42... Line 42...
42
/* routines from here */
42
/* routines from here */
43
 
43
 
44
/* Device driver actions */
44
/* Device driver actions */
45
static void GNOME_Activate(NewDevDesc *dd);
45
static void GNOME_Activate(NewDevDesc *dd);
46
static void GNOME_Circle(double x, double y, double r,
46
static void GNOME_Circle(double x, double y, double r,
47
		       int col, int fill, double gamma, int lty, double lwd,
47
			 R_GE_gcontext *gc,
48
		       NewDevDesc *dd);
48
			 NewDevDesc *dd);
49
static void GNOME_Clip(double x0, double x1, double y0, double y1, 
49
static void GNOME_Clip(double x0, double x1, double y0, double y1, 
50
		     NewDevDesc *dd);
50
		     NewDevDesc *dd);
51
static void GNOME_Close(NewDevDesc *dd);
51
static void GNOME_Close(NewDevDesc *dd);
52
static void GNOME_Deactivate(NewDevDesc *dd);
52
static void GNOME_Deactivate(NewDevDesc *dd);
53
static void GNOME_Hold(NewDevDesc *dd);
53
static void GNOME_Hold(NewDevDesc *dd);
54
static Rboolean GNOME_Locator(double *x, double *y, NewDevDesc *dd);
54
static Rboolean GNOME_Locator(double *x, double *y, NewDevDesc *dd);
55
static void GNOME_Line(double x1, double y1, double x2, double y2,
55
static void GNOME_Line(double x1, double y1, double x2, double y2,
56
		     int col, double gamma, int lty, double lwd,
56
		       R_GE_gcontext *gc,
57
		     NewDevDesc *dd);
57
		       NewDevDesc *dd);
58
static void GNOME_MetricInfo(int c, int font, double cex, double ps,
58
static void GNOME_MetricInfo(int c,
-
 
59
			     R_GE_gcontext *gc,
59
			      double* ascent, double* descent,
60
			     double* ascent, double* descent,
60
			      double* width, NewDevDesc *dd);
61
			     double* width, NewDevDesc *dd);
61
static void GNOME_Mode(int mode, NewDevDesc *dd);
62
static void GNOME_Mode(int mode, NewDevDesc *dd);
62
static void GNOME_NewPage(int fill, double gamma, NewDevDesc *dd);
63
static void GNOME_NewPage(R_GE_gcontext *gc, NewDevDesc *dd);
63
static void GNOME_Polygon(int n, double *x, double *y, 
64
static void GNOME_Polygon(int n, double *x, double *y, 
64
			int col, int fill, double gamma, int lty, double lwd,
65
			  R_GE_gcontext *gc,
65
			NewDevDesc *dd);
66
			  NewDevDesc *dd);
66
static void GNOME_Polyline(int n, double *x, double *y, 
67
static void GNOME_Polyline(int n, double *x, double *y, 
67
			    int col, double gamma, int lty, double lwd,
68
			   R_GE_gcontext *gc,
68
			    NewDevDesc *dd);
69
			   NewDevDesc *dd);
69
static void GNOME_Rect(double x0, double y0, double x1, double y1,
70
static void GNOME_Rect(double x0, double y0, double x1, double y1,
70
		     int col, int fill, double gamma, int lty, double lwd,
71
		       R_GE_gcontext *gc,
71
		     NewDevDesc *dd);
72
		       NewDevDesc *dd);
72
static void GNOME_Resize(NewDevDesc *dd);
73
static void GNOME_Resize(NewDevDesc *dd);
73
static void GNOME_Size(double *left, double *right,
74
static void GNOME_Size(double *left, double *right,
74
		     double *bottom, double *top,
75
		     double *bottom, double *top,
75
		     NewDevDesc *dd);
76
		     NewDevDesc *dd);
76
static double GNOME_StrWidth(char *str, int font,
77
static double GNOME_StrWidth(char *str, 
-
 
78
			     R_GE_gcontext *gc,
77
			      double cex, double ps, NewDevDesc *dd);
79
			     NewDevDesc *dd);
78
static void GNOME_Text(double x, double y, char *str, 
80
static void GNOME_Text(double x, double y, char *str, 
79
		     double rot, double hadj, 
81
		       double rot, double hadj, 
80
		     int col, double gamma, int font, double cex, double ps,
82
		       R_GE_gcontext *gc,
81
		     NewDevDesc *dd);
83
		       NewDevDesc *dd);
82
static Rboolean GNOME_Open(NewDevDesc*, gnomeDesc*, char*, double, double);
84
static Rboolean GNOME_Open(NewDevDesc*, gnomeDesc*, char*, double, double);
83
 
85
 
84
			/* Pixel Dimensions (Inches) */
86
			/* Pixel Dimensions (Inches) */
85
 
87
 
86
static double pixelWidth(void)
88
static double pixelWidth(void)
Line 428... Line 430...
428
      GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_CLOSE, 0, 
430
      GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_CLOSE, 0, 
429
      (GdkModifierType) 0, NULL },
431
      (GdkModifierType) 0, NULL },
430
    GNOMEUIINFO_END
432
    GNOMEUIINFO_END
431
};
433
};
432
 
434
 
433
static void GNOME_NewPage(int fill, double gamma, NewDevDesc *dd)
435
static void GNOME_NewPage(R_GE_gcontext *gc,
-
 
436
			  NewDevDesc *dd)
434
{
437
{
435
  GnomeCanvasItem *group;
438
  GnomeCanvasItem *group;
436
  gnomeDesc *gd = (gnomeDesc*) dd->deviceSpecific;
439
  gnomeDesc *gd = (gnomeDesc*) dd->deviceSpecific;
437
 
440
 
438
  g_return_if_fail(gd->canvas);
441
  g_return_if_fail(gd->canvas);
Line 459... Line 462...
459
			   "y1", (double) 0.0,
462
			   "y1", (double) 0.0,
460
			   "x2", (double) gd->windowWidth,
463
			   "x2", (double) gd->windowWidth,
461
			   "y2", (double) gd->windowHeight,
464
			   "y2", (double) gd->windowHeight,
462
			   NULL);
465
			   NULL);
463
 
466
 
464
  if (R_OPAQUE(fill))
467
  if (R_OPAQUE(gc->fill))
465
    {
468
    {
466
      gnome_canvas_item_set(gd->plotarea,
469
      gnome_canvas_item_set(gd->plotarea,
467
			    "fill_color_rgba", Color_RGBA(fill),
470
			    "fill_color_rgba", Color_RGBA(gc->fill),
468
			    NULL);
471
			    NULL);
469
    }
472
    }
470
  else
473
  else
471
    {
474
    {
472
      gnome_canvas_item_set(gd->plotarea,
475
      gnome_canvas_item_set(gd->plotarea,
Line 478... Line 481...
478
/* create window etc */
481
/* create window etc */
479
static Rboolean
482
static Rboolean
480
GNOME_Open(NewDevDesc *dd, gnomeDesc *gd, char *dsp, double w, double h)
483
GNOME_Open(NewDevDesc *dd, gnomeDesc *gd, char *dsp, double w, double h)
481
{
484
{
482
    gint iw, ih;
485
    gint iw, ih;
-
 
486
    R_GE_gcontext gc;
483
 
487
 
484
    /*gdk_rgb_set_install(TRUE); */
488
    /*gdk_rgb_set_install(TRUE); */
485
    /* gdk_rgb_set_verbose(TRUE);*/
489
    /* gdk_rgb_set_verbose(TRUE);*/
486
    gdk_rgb_init();
490
    gdk_rgb_init();
487
    gtk_widget_push_visual(gdk_rgb_get_visual());
491
    gtk_widget_push_visual(gdk_rgb_get_visual());
Line 517... Line 521...
517
    gnome_canvas_set_scroll_region(GNOME_CANVAS(gd->canvas), 0, 0, iw, ih);
521
    gnome_canvas_set_scroll_region(GNOME_CANVAS(gd->canvas), 0, 0, iw, ih);
518
 
522
 
519
    /* create new plot area on canvas */
523
    /* create new plot area on canvas */
520
    /* FIXME: We should have a canvas color argument */
524
    /* FIXME: We should have a canvas color argument */
521
    /* gamma is defaulted to 1 here */
525
    /* gamma is defaulted to 1 here */
-
 
526
    /* 
-
 
527
     * WARNING: Many graphical parameters are unset - if GNOME_NewPage
-
 
528
     * starts to make use of more than fill and gamma then more 
-
 
529
     * parameters need setting here.
-
 
530
     */
522
    GNOME_NewPage(R_RGB(255,255,255), 1, dd);
531
    gc.fill = R_RGB(255,255,255);
-
 
532
    gc.gamma = 1;
-
 
533
    GNOME_NewPage(&gc, dd);
523
 
534
 
524
    /* place and realize the canvas */
535
    /* place and realize the canvas */
525
    gnome_app_set_contents(GNOME_APP(gd->window), gd->canvas);
536
    gnome_app_set_contents(GNOME_APP(gd->window), gd->canvas);
526
    gtk_widget_realize(gd->canvas);
537
    gtk_widget_realize(gd->canvas);
527
 
538
 
Line 549... Line 560...
549
 
560
 
550
    /* we made it! */
561
    /* we made it! */
551
    return TRUE;
562
    return TRUE;
552
}
563
}
553
 
564
 
554
static double GNOME_StrWidth(char *str, int font,
565
static double GNOME_StrWidth(char *str, 
-
 
566
			     R_GE_gcontext *gc,
555
			      double cex, double ps, NewDevDesc *dd)
567
			     NewDevDesc *dd)
556
{
568
{
557
  int size;
569
  int size;
558
  gnomeDesc *gd = (gnomeDesc *) dd->deviceSpecific;
570
  gnomeDesc *gd = (gnomeDesc *) dd->deviceSpecific;
559
 
571
 
560
  size = cex * ps + 0.5;
572
  size = gc->cex * gc->ps + 0.5;
561
  SetFont(dd, font, size);
573
  SetFont(dd, gc->fontface, size);
562
 
574
 
563
  return (double) gdk_string_width(gd->font, str);
575
  return (double) gdk_string_width(gd->font, str);
564
}
576
}
565
 
577
 
566
static void GNOME_MetricInfo(int c, int font, double cex, double ps,
578
static void GNOME_MetricInfo(int c, 
-
 
579
			     R_GE_gcontext *gc,
567
			      double* ascent, double* descent,
580
			     double* ascent, double* descent,
568
			      double* width, NewDevDesc *dd)
581
			     double* width, NewDevDesc *dd)
569
{
582
{
570
  gint size;
583
  gint size;
571
  gint lbearing, rbearing, iascent, idescent, iwidth;
584
  gint lbearing, rbearing, iascent, idescent, iwidth;
572
  gint maxwidth;
585
  gint maxwidth;
573
  gchar tmp[2];
586
  gchar tmp[2];
574
  gnomeDesc *gd = (gnomeDesc *) dd->deviceSpecific;
587
  gnomeDesc *gd = (gnomeDesc *) dd->deviceSpecific;
575
 
588
 
576
  size = cex * ps + 0.5;
589
  size = gc->cex * gc->ps + 0.5;
577
  SetFont(dd, font, size);
590
  SetFont(dd, gc->fontface, size);
578
 
591
 
579
  if(c == 0) {
592
  if(c == 0) {
580
    maxwidth = 0;
593
    maxwidth = 0;
581
 
594
 
582
    for(c = 0; c <= 255; c++) {
595
    for(c = 0; c <= 255; c++) {
Line 718... Line 731...
718
}
731
}
719
 
732
 
720
/* drawing stuff */
733
/* drawing stuff */
721
 
734
 
722
static void GNOME_Rect(double x0, double y0, double x1, double y1,
735
static void GNOME_Rect(double x0, double y0, double x1, double y1,
723
		     int col, int fill, double gamma, int lty, double lwd,
736
		       R_GE_gcontext *gc,
724
		     NewDevDesc *dd)
737
		       NewDevDesc *dd)
725
{
738
{
726
    double tmp;
739
    double tmp;
727
    gnomeDesc *gd = (gnomeDesc *) dd->deviceSpecific;
740
    gnomeDesc *gd = (gnomeDesc *) dd->deviceSpecific;
728
    GnomeCanvasItem *item;
741
    GnomeCanvasItem *item;
729
 
742
 
Line 742... Line 755...
742
				 gnome_canvas_rect_get_type(),
755
				 gnome_canvas_rect_get_type(),
743
				 "x1", x0,
756
				 "x1", x0,
744
				 "y1", y0,
757
				 "y1", y0,
745
				 "x2", x1,
758
				 "x2", x1,
746
				 "y2", y1,
759
				 "y2", y1,
747
				 "width_units", (double) lwd,
760
				 "width_units", (double) gc->lwd,
748
				 NULL);
761
				 NULL);
749
 
762
 
750
    if(fill != NA_INTEGER) {
763
    if(gc->fill != NA_INTEGER) {
751
	gnome_canvas_item_set(item,
764
	gnome_canvas_item_set(item,
752
			      "fill_color_rgba", Color_RGBA(fill),
765
			      "fill_color_rgba", Color_RGBA(gc->fill),
753
			      NULL);
766
			      NULL);
754
    }
767
    }
755
    if(col != NA_INTEGER) {
768
    if(gc->col != NA_INTEGER) {
756
	gnome_canvas_item_set(item,
769
	gnome_canvas_item_set(item,
757
			      "outline_color_rgba", Color_RGBA(col),
770
			      "outline_color_rgba", Color_RGBA(gc->col),
758
			      NULL);
771
			      NULL);
759
    }
772
    }
760
}
773
}
761
 
774
 
762
static void GNOME_Circle(double x, double y, double r,
775
static void GNOME_Circle(double x, double y, double r,
763
		       int col, int fill, double gamma, int lty, double lwd,
776
			 R_GE_gcontext *gc,
764
		       NewDevDesc *dd)
777
			 NewDevDesc *dd)
765
{
778
{
766
    double x1, y1, x2, y2;
779
    double x1, y1, x2, y2;
767
    gnomeDesc *gd = (gnomeDesc *) dd->deviceSpecific;
780
    gnomeDesc *gd = (gnomeDesc *) dd->deviceSpecific;
768
    GnomeCanvasItem *item;
781
    GnomeCanvasItem *item;
769
 
782
 
Line 774... Line 787...
774
				 gnome_canvas_ellipse_get_type(),
787
				 gnome_canvas_ellipse_get_type(),
775
				 "x1", x1,
788
				 "x1", x1,
776
				 "y1", y1,
789
				 "y1", y1,
777
				 "x2", x2,
790
				 "x2", x2,
778
				 "y2", y2,
791
				 "y2", y2,
779
				 "width_units", (double) lwd,
792
				 "width_units", (double) gc->lwd,
780
				 NULL);
793
				 NULL);
781
 
794
 
782
    if(fill != NA_INTEGER) {
795
    if(gc->fill != NA_INTEGER) {
783
	gnome_canvas_item_set(item,
796
	gnome_canvas_item_set(item,
784
			      "fill_color_rgba", Color_RGBA(fill),
797
			      "fill_color_rgba", Color_RGBA(gc->fill),
785
			      NULL);
798
			      NULL);
786
    }
799
    }
787
    if(col != NA_INTEGER) {
800
    if(gc->col != NA_INTEGER) {
788
	gnome_canvas_item_set(item,
801
	gnome_canvas_item_set(item,
789
			      "outline_color_rgba", Color_RGBA(col),
802
			      "outline_color_rgba", Color_RGBA(gc->col),
790
			      NULL);
803
			      NULL);
791
    }
804
    }
792
}
805
}
793
 
806
 
794
static void GNOME_Line(double x1, double y1, double x2, double y2,
807
static void GNOME_Line(double x1, double y1, double x2, double y2,
795
		     int col, double gamma, int lty, double lwd,
808
		       R_GE_gcontext *gc,
796
		     NewDevDesc *dd)
809
		       NewDevDesc *dd)
797
{
810
{
798
    GnomeCanvasPoints *points;
811
    GnomeCanvasPoints *points;
799
    gnomeDesc *gd = (gnomeDesc *) dd->deviceSpecific;
812
    gnomeDesc *gd = (gnomeDesc *) dd->deviceSpecific;
800
    GnomeCanvasItem *item;
813
    GnomeCanvasItem *item;
801
 
814
 
Line 806... Line 819...
806
    points->coords[3] = y2;
819
    points->coords[3] = y2;
807
 
820
 
808
    item = gnome_canvas_item_new(gd->group,
821
    item = gnome_canvas_item_new(gd->group,
809
				 gnome_canvas_line_get_type(),
822
				 gnome_canvas_line_get_type(),
810
				 "points", points,
823
				 "points", points,
811
				 "width_units", (double) lwd,
824
				 "width_units", (double) gc->lwd,
812
				 NULL);
825
				 NULL);
813
 
826
 
814
    if(col != NA_INTEGER) {
827
    if(gc->col != NA_INTEGER) {
815
	if(lty != 0) {
828
	if(gc->lty != 0) {
816
	    /*SetLineType(GNOME_CANVAS_LINE(item)->gc, lty, lwd);*/
829
	    /*SetLineType(GNOME_CANVAS_LINE(item)->gc, lty, lwd);*/
817
	    gnome_canvas_item_set(item,
830
	    gnome_canvas_item_set(item,
818
				  "line_style", GDK_LINE_ON_OFF_DASH,
831
				  "line_style", GDK_LINE_ON_OFF_DASH,
819
				  NULL);
832
				  NULL);
820
	}
833
	}
821
	gnome_canvas_item_set(item,
834
	gnome_canvas_item_set(item,
822
			      "fill_color_rgba", Color_RGBA(col),
835
			      "fill_color_rgba", Color_RGBA(gc->col),
823
			      NULL);
836
			      NULL);
824
    }
837
    }
825
 
838
 
826
    gnome_canvas_points_free(points);
839
    gnome_canvas_points_free(points);
827
}
840
}
828
 
841
 
829
static void GNOME_Polyline(int n, double *x, double *y, 
842
static void GNOME_Polyline(int n, double *x, double *y, 
830
			    int col, double gamma, int lty, double lwd,
843
			   R_GE_gcontext *gc,
831
			    NewDevDesc *dd)
844
			   NewDevDesc *dd)
832
{
845
{
833
    int i;
846
    int i;
834
    GnomeCanvasPoints *points;
847
    GnomeCanvasPoints *points;
835
    gnomeDesc *gd = (gnomeDesc *) dd->deviceSpecific;
848
    gnomeDesc *gd = (gnomeDesc *) dd->deviceSpecific;
836
    GnomeCanvasItem *item;
849
    GnomeCanvasItem *item;
Line 843... Line 856...
843
    }
856
    }
844
 
857
 
845
    item = gnome_canvas_item_new(gd->group,
858
    item = gnome_canvas_item_new(gd->group,
846
				 gnome_canvas_line_get_type(),
859
				 gnome_canvas_line_get_type(),
847
				 "points", points,
860
				 "points", points,
848
				 "width_units", (double) lwd,
861
				 "width_units", (double) gc->lwd,
849
				 NULL);
862
				 NULL);
850
 
863
 
851
    if(col != NA_INTEGER) {
864
    if(gc->col != NA_INTEGER) {
852
	if(lty != 0) {
865
	if(gc->lty != 0) {
853
	  /*
866
	  /*
854
	    SetLineType(&stipple, lty, lwd);
867
	    SetLineType(&stipple, lty, lwd);
855
	    gnome_canvas_item_set(item,
868
	    gnome_canvas_item_set(item,
856
				  "fill_stipple", &stipple,
869
				  "fill_stipple", &stipple,
857
				  NULL);
870
				  NULL);
Line 859... Line 872...
859
	    gnome_canvas_item_set(item,
872
	    gnome_canvas_item_set(item,
860
				  "line_style", GDK_LINE_ON_OFF_DASH,
873
				  "line_style", GDK_LINE_ON_OFF_DASH,
861
				  NULL);
874
				  NULL);
862
	}
875
	}
863
	gnome_canvas_item_set(item,
876
	gnome_canvas_item_set(item,
864
			      "fill_color_rgba", Color_RGBA(col),
877
			      "fill_color_rgba", Color_RGBA(gc->col),
865
			      NULL);
878
			      NULL);
866
    }
879
    }
867
 
880
 
868
    gnome_canvas_points_free(points);
881
    gnome_canvas_points_free(points);
869
}
882
}
870
 
883
 
871
static void GNOME_Polygon(int n, double *x, double *y, 
884
static void GNOME_Polygon(int n, double *x, double *y, 
872
			int col, int fill, double gamma, int lty, double lwd,
885
			  R_GE_gcontext *gc,
873
			NewDevDesc *dd)
886
			  NewDevDesc *dd)
874
{
887
{
875
    int i;
888
    int i;
876
    GnomeCanvasPoints *points;
889
    GnomeCanvasPoints *points;
877
    gnomeDesc *gd = (gnomeDesc *) dd->deviceSpecific;
890
    gnomeDesc *gd = (gnomeDesc *) dd->deviceSpecific;
878
    GnomeCanvasItem *item;
891
    GnomeCanvasItem *item;
Line 888... Line 901...
888
				 gnome_canvas_polygon_get_type(),
901
				 gnome_canvas_polygon_get_type(),
889
				 "points", points,
902
				 "points", points,
890
				 "width_units", (double) 2,
903
				 "width_units", (double) 2,
891
				 NULL);
904
				 NULL);
892
 
905
 
893
    if(fill != NA_INTEGER) {
906
    if(gc->fill != NA_INTEGER) {
894
	gnome_canvas_item_set(item,
907
	gnome_canvas_item_set(item,
895
			      "fill_color_rgba", Color_RGBA(fill),
908
			      "fill_color_rgba", Color_RGBA(gc->fill),
896
			      NULL);
909
			      NULL);
897
    }
910
    }
898
    if(col != NA_INTEGER) {
911
    if(gc->col != NA_INTEGER) {
899
	gnome_canvas_item_set(item,
912
	gnome_canvas_item_set(item,
900
			      "outline_color_rgba", Color_RGBA(col),
913
			      "outline_color_rgba", Color_RGBA(gc->col),
901
			      NULL);
914
			      NULL);
902
    }
915
    }
903
 
916
 
904
    gnome_canvas_points_free(points);
917
    gnome_canvas_points_free(points);
905
}
918
}
906
 
919
 
907
static void GNOME_Text(double x, double y, char *str, 
920
static void GNOME_Text(double x, double y, char *str, 
908
		     double rot, double hadj, 
921
		       double rot, double hadj, 
909
		     int col, double gamma, int font, double cex, double ps,
922
		       R_GE_gcontext *gc,
910
		     NewDevDesc *dd)
923
		       NewDevDesc *dd)
911
{
924
{
912
  double affine[6] = {1, 0, 0, 1, 0, 0};
925
  double affine[6] = {1, 0, 0, 1, 0, 0};
913
  double rrot = DEG2RAD * rot;
926
  double rrot = DEG2RAD * rot;
914
  GnomeCanvasItem *item;
927
  GnomeCanvasItem *item;
915
  gnomeDesc *gd = (gnomeDesc *) dd->deviceSpecific;
928
  gnomeDesc *gd = (gnomeDesc *) dd->deviceSpecific;
916
  int size;
929
  int size;
917
 
930
 
918
  size = cex * ps + 0.5;
931
  size = gc->cex * gc->ps + 0.5;
919
  SetFont(dd, font, size);
932
  SetFont(dd, gc->fontface, size);
920
  
933
  
921
  if (rot != 0)
934
  if (rot != 0)
922
    {
935
    {
923
      affine[0] = affine[3] = cos(rrot);
936
      affine[0] = affine[3] = cos(rrot);
924
      affine[1] = -sin(rrot);
937
      affine[1] = -sin(rrot);
Line 933... Line 946...
933
				"text", str,
946
				"text", str,
934
				"anchor", GTK_ANCHOR_SOUTH_WEST,
947
				"anchor", GTK_ANCHOR_SOUTH_WEST,
935
				"x", x,
948
				"x", x,
936
				"y", y,
949
				"y", y,
937
				"font_gdk", gd->font,
950
				"font_gdk", gd->font,
938
				"fill_color_rgba", Color_RGBA(col),
951
				"fill_color_rgba", Color_RGBA(gc->col),
939
				NULL);
952
				NULL);
940
 
953
 
941
  if (rot != 0)
954
  if (rot != 0)
942
    gnome_canvas_item_affine_relative (item, affine);
955
    gnome_canvas_item_affine_relative (item, affine);
943
}
956
}