xref: /petsc/src/sys/classes/draw/interface/dmarker.c (revision 6a9046bcf1dc7e213a87d3843bfa02f323786ad4)
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   PetscBool      isnull;
32 
33   PetscFunctionBegin;
34   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
35   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
36   if (isnull) PetscFunctionReturn(0);
37   if (draw->markertype == PETSC_DRAW_MARKER_CROSS){
38     if (draw->ops->coordinatetopixel && draw->ops->pointpixel) {
39       PetscInt i,j,k;
40       ierr = (*draw->ops->coordinatetopixel)(draw,xl,yl,&i,&j);CHKERRQ(ierr);
41       for (k=-2; k<=2; k++) {
42         ierr = (*draw->ops->pointpixel)(draw,i+k,j+k,cl);CHKERRQ(ierr);
43         ierr = (*draw->ops->pointpixel)(draw,i+k,j-k,cl);CHKERRQ(ierr);
44       }
45     } else if (draw->ops->string) {
46        ierr = (*draw->ops->string)(draw,xl,yl,cl,"x");CHKERRQ(ierr);
47     } else SETERRQ(PetscObjectComm((PetscObject)draw),PETSC_ERR_SUP,"No support for drawing marker type CROSS");
48   } else if (draw->markertype == PETSC_DRAW_MARKER_PLUS){
49     if (draw->ops->coordinatetopixel && draw->ops->pointpixel) {
50       PetscInt i,j,k;
51       ierr = (*draw->ops->coordinatetopixel)(draw,xl,yl,&i,&j);CHKERRQ(ierr);
52       for (k=-2; k<=2; k++) {
53         ierr = (*draw->ops->pointpixel)(draw,i,j+k,cl);CHKERRQ(ierr);
54         ierr = (*draw->ops->pointpixel)(draw,i+k,j,cl);CHKERRQ(ierr);
55       }
56     } else if (draw->ops->string) {
57        ierr = (*draw->ops->string)(draw,xl,yl,cl,"+");CHKERRQ(ierr);
58     } else SETERRQ(PetscObjectComm((PetscObject)draw),PETSC_ERR_SUP,"No support for drawing marker type PLUS");
59   } else if (draw->markertype == PETSC_DRAW_MARKER_CIRCLE){
60     if (draw->ops->coordinatetopixel && draw->ops->pointpixel) {
61       PetscInt i,j,k;
62       ierr = (*draw->ops->coordinatetopixel)(draw,xl,yl,&i,&j);CHKERRQ(ierr);
63       for (k=-1; k<=1; k++) {
64         ierr = (*draw->ops->pointpixel)(draw,i+2,j+k,cl);CHKERRQ(ierr);
65         ierr = (*draw->ops->pointpixel)(draw,i-2,j+k,cl);CHKERRQ(ierr);
66         ierr = (*draw->ops->pointpixel)(draw,i+k,j+2,cl);CHKERRQ(ierr);
67         ierr = (*draw->ops->pointpixel)(draw,i+k,j-2,cl);CHKERRQ(ierr);
68       }
69     } else if (draw->ops->string) {
70        ierr = (*draw->ops->string)(draw,xl,yl,cl,"+");CHKERRQ(ierr);
71     } else SETERRQ(PetscObjectComm((PetscObject)draw),PETSC_ERR_SUP,"No support for drawing marker type CIRCLE");
72   } else {
73     ierr = (*draw->ops->point)(draw,xl,yl,cl);CHKERRQ(ierr);
74   }
75   PetscFunctionReturn(0);
76 }
77 
78 #undef __FUNCT__
79 #define __FUNCT__ "PetscDrawSetMarkerType"
80 /*@
81    PetscDrawSetMarkerType - sets the type of marker to display with PetscDrawMarker()
82 
83    Not collective
84 
85    Input Parameters:
86 +  draw - the drawing context
87 -  mtype - either PETSC_DRAW_MARKER_CROSS (default) or PETSC_DRAW_MARKER_POINT
88 
89    Options Database:
90 .  -draw_marker_type - x or point
91 
92    Level: beginner
93 
94    Concepts: marker^drawing
95    Concepts: drawing^marker
96 
97 .seealso: PetscDrawPoint(), PetscDrawMarker()
98 
99 @*/
100 PetscErrorCode  PetscDrawSetMarkerType(PetscDraw draw,PetscDrawMarkerType mtype)
101 {
102   PetscFunctionBegin;
103   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
104   draw->markertype = mtype;
105   PetscFunctionReturn(0);
106 }
107 
108 #undef __FUNCT__
109 #define __FUNCT__ "PetscDrawGetMarkerType"
110 /*@
111    PetscDrawGetMarkerType - gets the type of marker to display with PetscDrawMarker()
112 
113    Not collective
114 
115    Input Parameters:
116 +  draw - the drawing context
117 -  mtype - either PETSC_DRAW_MARKER_CROSS (default) or PETSC_DRAW_MARKER_POINT
118 
119    Level: beginner
120 
121    Concepts: marker^drawing
122    Concepts: drawing^marker
123 
124 .seealso: PetscDrawPoint(), PetscDrawMarker()
125 
126 @*/
127 PetscErrorCode  PetscDrawGetMarkerType(PetscDraw draw,PetscDrawMarkerType *mtype)
128 {
129   PetscFunctionBegin;
130   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
131   *mtype = draw->markertype;
132   PetscFunctionReturn(0);
133 }
134