xref: /petsc/src/sys/classes/draw/interface/dmarker.c (revision e611a964e9853b74d61a56642fe9d06a6e51780f) !
1 
2 /*
3        Provides the calling sequences for all the basic PetscDraw routines.
4 */
5 #include <petsc/private/drawimpl.h>  /*I "petscdraw.h" I*/
6 const char *const PetscDrawMarkerTypes[]     = {"CROSS","POINT","PLUS","CIRCLE","PetscDrawMarkerType","PETSC_DRAW_MARKER_",0};
7 
8 #undef __FUNCT__
9 #define __FUNCT__ "PetscDrawMarker"
10 /*@
11    PetscDrawMarker - PetscDraws a marker onto a drawable.
12 
13    Not collective
14 
15    Input Parameters:
16 +  draw - the drawing context
17 .  xl,yl - the coordinates of the marker
18 -  cl - the color of the marker
19 
20    Level: beginner
21 
22    Concepts: marker^drawing
23    Concepts: drawing^marker
24 
25 .seealso: PetscDrawPoint(), PetscDrawString(), PetscDrawSetMarkerType()
26 
27 @*/
28 PetscErrorCode  PetscDrawMarker(PetscDraw draw,PetscReal xl,PetscReal yl,int cl)
29 {
30   PetscErrorCode ierr;
31 
32   PetscFunctionBegin;
33   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
34   if (draw->markertype == PETSC_DRAW_MARKER_CROSS){
35     if (draw->ops->coordinatetopixel && draw->ops->pointpixel) {
36       int i,j,k;
37       ierr = (*draw->ops->coordinatetopixel)(draw,xl,yl,&i,&j);CHKERRQ(ierr);
38       for (k=-2; k<=2; k++) {
39         ierr = (*draw->ops->pointpixel)(draw,i+k,j+k,cl);CHKERRQ(ierr);
40         ierr = (*draw->ops->pointpixel)(draw,i+k,j-k,cl);CHKERRQ(ierr);
41       }
42     } else if (draw->ops->string) {
43        ierr = (*draw->ops->string)(draw,xl,yl,cl,"x");CHKERRQ(ierr);
44     } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for drawing marker type CROSS");
45   } else if (draw->markertype == PETSC_DRAW_MARKER_PLUS){
46     if (draw->ops->coordinatetopixel && draw->ops->pointpixel) {
47       int i,j,k;
48       ierr = (*draw->ops->coordinatetopixel)(draw,xl,yl,&i,&j);CHKERRQ(ierr);
49       for (k=-2; k<=2; k++) {
50         ierr = (*draw->ops->pointpixel)(draw,i,j+k,cl);CHKERRQ(ierr);
51         ierr = (*draw->ops->pointpixel)(draw,i+k,j,cl);CHKERRQ(ierr);
52       }
53     } else if (draw->ops->string) {
54        ierr = (*draw->ops->string)(draw,xl,yl,cl,"+");CHKERRQ(ierr);
55     } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for drawing marker type PLUS");
56   } else if (draw->markertype == PETSC_DRAW_MARKER_CIRCLE){
57     if (draw->ops->coordinatetopixel && draw->ops->pointpixel) {
58       int i,j,k;
59       ierr = (*draw->ops->coordinatetopixel)(draw,xl,yl,&i,&j);CHKERRQ(ierr);
60       for (k=-1; k<=1; k++) {
61         ierr = (*draw->ops->pointpixel)(draw,i+2,j+k,cl);CHKERRQ(ierr);
62         ierr = (*draw->ops->pointpixel)(draw,i-2,j+k,cl);CHKERRQ(ierr);
63         ierr = (*draw->ops->pointpixel)(draw,i+k,j+2,cl);CHKERRQ(ierr);
64         ierr = (*draw->ops->pointpixel)(draw,i+k,j-2,cl);CHKERRQ(ierr);
65       }
66     } else if (draw->ops->string) {
67        ierr = (*draw->ops->string)(draw,xl,yl,cl,"+");CHKERRQ(ierr);
68     } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for drawing marker type CIRCLE");
69   } else {
70     ierr = (*draw->ops->point)(draw,xl,yl,cl);CHKERRQ(ierr);
71   }
72   PetscFunctionReturn(0);
73 }
74 
75 #undef __FUNCT__
76 #define __FUNCT__ "PetscDrawSetMarkerType"
77 /*@
78    PetscDrawSetMarkerType - sets the type of marker to display with PetscDrawMarker()
79 
80    Not collective
81 
82    Input Parameters:
83 +  draw - the drawing context
84 -  mtype - either PETSC_DRAW_MARKER_CROSS (default) or PETSC_DRAW_MARKER_POINT
85 
86    Options Database:
87 .  -draw_marker_type - x or point
88 
89    Level: beginner
90 
91    Concepts: marker^drawing
92    Concepts: drawing^marker
93 
94 .seealso: PetscDrawPoint(), PetscDrawMarker()
95 
96 @*/
97 PetscErrorCode  PetscDrawSetMarkerType(PetscDraw draw,PetscDrawMarkerType mtype)
98 {
99   PetscFunctionBegin;
100   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
101   draw->markertype = mtype;
102   PetscFunctionReturn(0);
103 }
104 
105 #undef __FUNCT__
106 #define __FUNCT__ "PetscDrawGetMarkerType"
107 /*@
108    PetscDrawGetMarkerType - gets the type of marker to display with PetscDrawMarker()
109 
110    Not collective
111 
112    Input Parameters:
113 +  draw - the drawing context
114 -  mtype - either PETSC_DRAW_MARKER_CROSS (default) or PETSC_DRAW_MARKER_POINT
115 
116    Level: beginner
117 
118    Concepts: marker^drawing
119    Concepts: drawing^marker
120 
121 .seealso: PetscDrawPoint(), PetscDrawMarker()
122 
123 @*/
124 PetscErrorCode  PetscDrawGetMarkerType(PetscDraw draw,PetscDrawMarkerType *mtype)
125 {
126   PetscFunctionBegin;
127   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
128   *mtype = draw->markertype;
129   PetscFunctionReturn(0);
130 }
131