xref: /petsc/src/sys/classes/draw/impls/image/drawimage.c (revision 2b8d69ca7ea5fe9190df62c1dce3bbd66fce84dd)
1*2b8d69caSLisandro Dalcin #include <../src/sys/classes/draw/impls/image/drawimage.h>   /*I  "petscdraw.h" I*/
2*2b8d69caSLisandro Dalcin #include <petsc/private/drawimpl.h>                          /*I  "petscdraw.h" I*/
3*2b8d69caSLisandro Dalcin 
4*2b8d69caSLisandro Dalcin #if defined(PETSC_USE_DEBUG)
5*2b8d69caSLisandro Dalcin #define PetscDrawValidColor(color) \
6*2b8d69caSLisandro Dalcin do { if (PetscUnlikely((color)<0||(color)>=256)) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Color value %D out of range [0..255]",(PetscInt)(color)); } while (0)
7*2b8d69caSLisandro Dalcin #else
8*2b8d69caSLisandro Dalcin #define PetscDrawValidColor(color) do {} while (0)
9*2b8d69caSLisandro Dalcin #endif
10*2b8d69caSLisandro Dalcin 
11*2b8d69caSLisandro Dalcin #define XTRANS(draw,img,x)  ((int)(((img)->w-1)*((draw)->port_xl + ((((x) - (draw)->coor_xl)*((draw)->port_xr - (draw)->port_xl))/((draw)->coor_xr - (draw)->coor_xl)))))
12*2b8d69caSLisandro Dalcin #define YTRANS(draw,img,y)  (((img)->h-1) - (int)(((img)->h-1)*((draw)->port_yl + ((((y) - (draw)->coor_yl)*((draw)->port_yr - (draw)->port_yl))/((draw)->coor_yr - (draw)->coor_yl)))))
13*2b8d69caSLisandro Dalcin 
14*2b8d69caSLisandro Dalcin #define ITRANS(draw,img,i)  ((draw)->coor_xl + (((PetscReal)(i))*((draw)->coor_xr - (draw)->coor_xl)/((img)->w-1) - (draw)->port_xl)/((draw)->port_xr - (draw)->port_xl))
15*2b8d69caSLisandro Dalcin #define JTRANS(draw,img,j)  ((draw)->coor_yl + (((PetscReal)(j))/((img)->h-1) + (draw)->port_yl - 1)*((draw)->coor_yr - (draw)->coor_yl)/((draw)->port_yl - (draw)->port_yr))
16*2b8d69caSLisandro Dalcin 
17*2b8d69caSLisandro Dalcin 
18*2b8d69caSLisandro Dalcin #undef __FUNCT__
19*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawSetViewport_Image"
20*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawSetViewport_Image(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr)
21*2b8d69caSLisandro Dalcin {
22*2b8d69caSLisandro Dalcin   PetscImage img = (PetscImage)draw->data;
23*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
24*2b8d69caSLisandro Dalcin   {
25*2b8d69caSLisandro Dalcin     int xmax = img->w - 1,   ymax = img->h - 1;
26*2b8d69caSLisandro Dalcin     int xa = (int)(xl*xmax), ya = ymax - (int)(yr*ymax);
27*2b8d69caSLisandro Dalcin     int xb = (int)(xr*xmax), yb = ymax - (int)(yl*ymax);
28*2b8d69caSLisandro Dalcin     PetscImageSetClip(img,xa,ya,xb+1-xa,yb+1-ya);
29*2b8d69caSLisandro Dalcin   }
30*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
31*2b8d69caSLisandro Dalcin }
32*2b8d69caSLisandro Dalcin 
33*2b8d69caSLisandro Dalcin /*
34*2b8d69caSLisandro Dalcin #undef __FUNCT__
35*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawSetCoordinates_Image"
36*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawSetCoordinates_Image(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr)
37*2b8d69caSLisandro Dalcin {
38*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
39*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
40*2b8d69caSLisandro Dalcin }*/
41*2b8d69caSLisandro Dalcin #define PetscDrawSetCoordinates_Image NULL
42*2b8d69caSLisandro Dalcin 
43*2b8d69caSLisandro Dalcin #undef __FUNCT__
44*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawCoordinateToPixel_Image"
45*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawCoordinateToPixel_Image(PetscDraw draw,PetscReal x,PetscReal y,PetscInt *i,PetscInt *j)
46*2b8d69caSLisandro Dalcin {
47*2b8d69caSLisandro Dalcin   PetscImage img = (PetscImage)draw->data;
48*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
49*2b8d69caSLisandro Dalcin   if (i) *i = XTRANS(draw,img,x);
50*2b8d69caSLisandro Dalcin   if (j) *j = YTRANS(draw,img,y);
51*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
52*2b8d69caSLisandro Dalcin }
53*2b8d69caSLisandro Dalcin 
54*2b8d69caSLisandro Dalcin #undef __FUNCT__
55*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawPixelToCoordinate_Image"
56*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawPixelToCoordinate_Image(PetscDraw draw,PetscInt i,PetscInt j,PetscReal *x,PetscReal *y)
57*2b8d69caSLisandro Dalcin {
58*2b8d69caSLisandro Dalcin   PetscImage img = (PetscImage)draw->data;
59*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
60*2b8d69caSLisandro Dalcin   if (x) *x = ITRANS(draw,img,i);
61*2b8d69caSLisandro Dalcin   if (y) *y = JTRANS(draw,img,j);
62*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
63*2b8d69caSLisandro Dalcin }
64*2b8d69caSLisandro Dalcin 
65*2b8d69caSLisandro Dalcin /*
66*2b8d69caSLisandro Dalcin #undef __FUNCT__
67*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawPointSetSize_Image"
68*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawPointSetSize_Image(PetscDraw draw,PetscReal width)
69*2b8d69caSLisandro Dalcin {
70*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
71*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
72*2b8d69caSLisandro Dalcin }*/
73*2b8d69caSLisandro Dalcin #define PetscDrawPointSetSize_Image NULL
74*2b8d69caSLisandro Dalcin 
75*2b8d69caSLisandro Dalcin #undef __FUNCT__
76*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawPoint_Image"
77*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawPoint_Image(PetscDraw draw,PetscReal x,PetscReal y,int c)
78*2b8d69caSLisandro Dalcin {
79*2b8d69caSLisandro Dalcin   PetscImage img = (PetscImage)draw->data;
80*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
81*2b8d69caSLisandro Dalcin   PetscDrawValidColor(c);
82*2b8d69caSLisandro Dalcin   {
83*2b8d69caSLisandro Dalcin     int j, xx = XTRANS(draw,img,x);
84*2b8d69caSLisandro Dalcin     int i, yy = YTRANS(draw,img,y);
85*2b8d69caSLisandro Dalcin     for (i=-1; i<=1; i++)
86*2b8d69caSLisandro Dalcin       for (j=-1; j<=1; j++)
87*2b8d69caSLisandro Dalcin         PetscImageDrawPixel(img,xx+j,yy+i,c);
88*2b8d69caSLisandro Dalcin   }
89*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
90*2b8d69caSLisandro Dalcin }
91*2b8d69caSLisandro Dalcin 
92*2b8d69caSLisandro Dalcin #undef __FUNCT__
93*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawPointPixel_Image"
94*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawPointPixel_Image(PetscDraw draw,PetscInt x,PetscInt y,int c)
95*2b8d69caSLisandro Dalcin {
96*2b8d69caSLisandro Dalcin   PetscImage img = (PetscImage)draw->data;
97*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
98*2b8d69caSLisandro Dalcin   PetscDrawValidColor(c);
99*2b8d69caSLisandro Dalcin   {
100*2b8d69caSLisandro Dalcin     PetscImageDrawPixel(img,(int)x,(int)y,c);
101*2b8d69caSLisandro Dalcin   }
102*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
103*2b8d69caSLisandro Dalcin }
104*2b8d69caSLisandro Dalcin 
105*2b8d69caSLisandro Dalcin /*
106*2b8d69caSLisandro Dalcin #undef __FUNCT__
107*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawLineSetWidth_Image"
108*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawLineSetWidth_Image(PetscDraw draw,PetscReal width)
109*2b8d69caSLisandro Dalcin {
110*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
111*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
112*2b8d69caSLisandro Dalcin }*/
113*2b8d69caSLisandro Dalcin #define PetscDrawLineSetWidth_Image NULL
114*2b8d69caSLisandro Dalcin 
115*2b8d69caSLisandro Dalcin #undef __FUNCT__
116*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawLineGetWidth_Image"
117*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawLineGetWidth_Image(PetscDraw draw,PetscReal *width)
118*2b8d69caSLisandro Dalcin {
119*2b8d69caSLisandro Dalcin   PetscImage img = (PetscImage)draw->data;
120*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
121*2b8d69caSLisandro Dalcin   {
122*2b8d69caSLisandro Dalcin     int lw = 1;
123*2b8d69caSLisandro Dalcin     *width = lw*(draw->coor_xr - draw->coor_xl)/(img->w*(draw->port_xr - draw->port_xl));
124*2b8d69caSLisandro Dalcin   }
125*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
126*2b8d69caSLisandro Dalcin }
127*2b8d69caSLisandro Dalcin 
128*2b8d69caSLisandro Dalcin #undef __FUNCT__
129*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawLine_Image"
130*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawLine_Image(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr,int c)
131*2b8d69caSLisandro Dalcin {
132*2b8d69caSLisandro Dalcin   PetscImage img = (PetscImage)draw->data;
133*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
134*2b8d69caSLisandro Dalcin   {
135*2b8d69caSLisandro Dalcin     int x_1 = XTRANS(draw,img,xl), x_2 = XTRANS(draw,img,xr);
136*2b8d69caSLisandro Dalcin     int y_1 = YTRANS(draw,img,yl), y_2 = YTRANS(draw,img,yr);
137*2b8d69caSLisandro Dalcin     PetscImageDrawLine(img,x_1,y_1,x_2,y_2,c);
138*2b8d69caSLisandro Dalcin   }
139*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
140*2b8d69caSLisandro Dalcin }
141*2b8d69caSLisandro Dalcin 
142*2b8d69caSLisandro Dalcin #undef __FUNCT__
143*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawArrow_Image"
144*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawArrow_Image(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr,int c)
145*2b8d69caSLisandro Dalcin {
146*2b8d69caSLisandro Dalcin   PetscImage img = (PetscImage)draw->data;
147*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
148*2b8d69caSLisandro Dalcin   PetscDrawValidColor(c);
149*2b8d69caSLisandro Dalcin   {
150*2b8d69caSLisandro Dalcin     int x_1 = XTRANS(draw,img,xl), x_2 = XTRANS(draw,img,xr);
151*2b8d69caSLisandro Dalcin     int y_1 = YTRANS(draw,img,yl), y_2 = YTRANS(draw,img,yr);
152*2b8d69caSLisandro Dalcin     if (x_1 == x_2 && y_1 == y_2) PetscFunctionReturn(0);
153*2b8d69caSLisandro Dalcin     PetscImageDrawLine(img,x_1,y_1,x_2,y_2,c);
154*2b8d69caSLisandro Dalcin     if (x_1 == x_2 && PetscAbs(y_1 - y_2) > 7) {
155*2b8d69caSLisandro Dalcin       if (y_2 > y_1) {
156*2b8d69caSLisandro Dalcin         PetscImageDrawLine(img,x_2,y_2,x_2-3,y_2-3,c);
157*2b8d69caSLisandro Dalcin         PetscImageDrawLine(img,x_2,y_2,x_2+3,y_2-3,c);
158*2b8d69caSLisandro Dalcin       } else {
159*2b8d69caSLisandro Dalcin         PetscImageDrawLine(img,x_2,y_2,x_2-3,y_2+3,c);
160*2b8d69caSLisandro Dalcin         PetscImageDrawLine(img,x_2,y_2,x_2+3,y_2+3,c);
161*2b8d69caSLisandro Dalcin       }
162*2b8d69caSLisandro Dalcin     }
163*2b8d69caSLisandro Dalcin     if (y_1 == y_2 && PetscAbs(x_1 - x_2) > 7) {
164*2b8d69caSLisandro Dalcin       if (x_2 > x_1) {
165*2b8d69caSLisandro Dalcin         PetscImageDrawLine(img,x_2-3,y_2-3,x_2,y_2,c);
166*2b8d69caSLisandro Dalcin         PetscImageDrawLine(img,x_2-3,y_2+3,x_2,y_2,c);
167*2b8d69caSLisandro Dalcin       } else {
168*2b8d69caSLisandro Dalcin         PetscImageDrawLine(img,x_2,y_2,x_2+3,y_2-3,c);
169*2b8d69caSLisandro Dalcin         PetscImageDrawLine(img,x_2,y_2,x_2+3,y_2+3,c);
170*2b8d69caSLisandro Dalcin       }
171*2b8d69caSLisandro Dalcin     }
172*2b8d69caSLisandro Dalcin    }
173*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
174*2b8d69caSLisandro Dalcin }
175*2b8d69caSLisandro Dalcin 
176*2b8d69caSLisandro Dalcin #undef __FUNCT__
177*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawRectangle_Image"
178*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawRectangle_Image(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr,int c1,int c2,int c3,int c4)
179*2b8d69caSLisandro Dalcin {
180*2b8d69caSLisandro Dalcin   PetscImage img = (PetscImage)draw->data;
181*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
182*2b8d69caSLisandro Dalcin   PetscDrawValidColor(c1);
183*2b8d69caSLisandro Dalcin   PetscDrawValidColor(c2);
184*2b8d69caSLisandro Dalcin   PetscDrawValidColor(c3);
185*2b8d69caSLisandro Dalcin   PetscDrawValidColor(c4);
186*2b8d69caSLisandro Dalcin   {
187*2b8d69caSLisandro Dalcin     int x = XTRANS(draw,img,xl), w = XTRANS(draw,img,xr) + 1 - x;
188*2b8d69caSLisandro Dalcin     int y = YTRANS(draw,img,yr), h = YTRANS(draw,img,yl) + 1 - y;
189*2b8d69caSLisandro Dalcin     int c  = (c1 + c2 + c3 + c4)/4;
190*2b8d69caSLisandro Dalcin     PetscImageDrawRectangle(img,x,y,w,h,c);
191*2b8d69caSLisandro Dalcin   }
192*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
193*2b8d69caSLisandro Dalcin }
194*2b8d69caSLisandro Dalcin 
195*2b8d69caSLisandro Dalcin #undef __FUNCT__
196*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawEllipse_Image"
197*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawEllipse_Image(PetscDraw draw,PetscReal x,PetscReal y,PetscReal a,PetscReal b,int c)
198*2b8d69caSLisandro Dalcin {
199*2b8d69caSLisandro Dalcin   PetscImage img = (PetscImage)draw->data;
200*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
201*2b8d69caSLisandro Dalcin   PetscDrawValidColor(c);
202*2b8d69caSLisandro Dalcin   a = PetscAbsReal(a);
203*2b8d69caSLisandro Dalcin   b = PetscAbsReal(b);
204*2b8d69caSLisandro Dalcin   {
205*2b8d69caSLisandro Dalcin     int xc = XTRANS(draw,img,x), w = XTRANS(draw,img,x + a/2) + 0 - xc;
206*2b8d69caSLisandro Dalcin     int yc = YTRANS(draw,img,y), h = YTRANS(draw,img,y - b/2) + 0 - yc;
207*2b8d69caSLisandro Dalcin     if (PetscAbsReal(a-b) <= 0)  w = h = PetscMin(w,h); /* workaround truncation errors */
208*2b8d69caSLisandro Dalcin     PetscImageDrawEllipse(img,xc,yc,w,h,c);
209*2b8d69caSLisandro Dalcin   }
210*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
211*2b8d69caSLisandro Dalcin }
212*2b8d69caSLisandro Dalcin 
213*2b8d69caSLisandro Dalcin #undef __FUNCT__
214*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawTriangle_Image"
215*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawTriangle_Image(PetscDraw draw,PetscReal X_1,PetscReal Y_1,PetscReal X_2,PetscReal Y_2,PetscReal X_3,PetscReal Y_3,int c1,int c2,int c3)
216*2b8d69caSLisandro Dalcin {
217*2b8d69caSLisandro Dalcin   PetscImage img = (PetscImage)draw->data;
218*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
219*2b8d69caSLisandro Dalcin   PetscDrawValidColor(c1);
220*2b8d69caSLisandro Dalcin   PetscDrawValidColor(c2);
221*2b8d69caSLisandro Dalcin   PetscDrawValidColor(c3);
222*2b8d69caSLisandro Dalcin   {
223*2b8d69caSLisandro Dalcin     int x_1 = XTRANS(draw,img,X_1), x_2 = XTRANS(draw,img,X_2), x_3 = XTRANS(draw,img,X_3);
224*2b8d69caSLisandro Dalcin     int y_1 = YTRANS(draw,img,Y_1), y_2 = YTRANS(draw,img,Y_2), y_3 = YTRANS(draw,img,Y_3);
225*2b8d69caSLisandro Dalcin     PetscImageDrawTriangle(img,x_1,y_1,c1,x_2,y_2,c2,x_3,y_3,c3);
226*2b8d69caSLisandro Dalcin   }
227*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
228*2b8d69caSLisandro Dalcin }
229*2b8d69caSLisandro Dalcin 
230*2b8d69caSLisandro Dalcin /*
231*2b8d69caSLisandro Dalcin #undef __FUNCT__
232*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawStringSetSize_Image"
233*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawStringSetSize_Image(PetscDraw draw,PetscReal w,PetscReal h)
234*2b8d69caSLisandro Dalcin {
235*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
236*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
237*2b8d69caSLisandro Dalcin }*/
238*2b8d69caSLisandro Dalcin #define PetscDrawStringSetSize_Image NULL
239*2b8d69caSLisandro Dalcin 
240*2b8d69caSLisandro Dalcin #undef __FUNCT__
241*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawStringGetSize_Image"
242*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawStringGetSize_Image(PetscDraw draw,PetscReal *w,PetscReal  *h)
243*2b8d69caSLisandro Dalcin {
244*2b8d69caSLisandro Dalcin   PetscImage img = (PetscImage)draw->data;
245*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
246*2b8d69caSLisandro Dalcin   {
247*2b8d69caSLisandro Dalcin     int tw = PetscImageFontWidth;
248*2b8d69caSLisandro Dalcin     int th = PetscImageFontHeight;
249*2b8d69caSLisandro Dalcin     if (w) *w = tw*(draw->coor_xr - draw->coor_xl)/(img->w*(draw->port_xr - draw->port_xl));
250*2b8d69caSLisandro Dalcin     if (h) *h = th*(draw->coor_yr - draw->coor_yl)/(img->h*(draw->port_yr - draw->port_yl));
251*2b8d69caSLisandro Dalcin   }
252*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
253*2b8d69caSLisandro Dalcin }
254*2b8d69caSLisandro Dalcin 
255*2b8d69caSLisandro Dalcin #undef __FUNCT__
256*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawString_Image"
257*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawString_Image(PetscDraw draw,PetscReal x,PetscReal y,int c,const char text[])
258*2b8d69caSLisandro Dalcin {
259*2b8d69caSLisandro Dalcin   PetscImage     img = (PetscImage)draw->data;
260*2b8d69caSLisandro Dalcin   PetscToken     token;
261*2b8d69caSLisandro Dalcin   char           *subtext;
262*2b8d69caSLisandro Dalcin   PetscErrorCode ierr;
263*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
264*2b8d69caSLisandro Dalcin   PetscDrawValidColor(c);
265*2b8d69caSLisandro Dalcin   {
266*2b8d69caSLisandro Dalcin     int xx = XTRANS(draw,img,x);
267*2b8d69caSLisandro Dalcin     int yy = YTRANS(draw,img,y);
268*2b8d69caSLisandro Dalcin     ierr = PetscTokenCreate(text,'\n',&token);CHKERRQ(ierr);
269*2b8d69caSLisandro Dalcin     ierr = PetscTokenFind(token,&subtext);CHKERRQ(ierr);
270*2b8d69caSLisandro Dalcin     while (subtext) {
271*2b8d69caSLisandro Dalcin       PetscImageDrawText(img,xx,yy,c,subtext);
272*2b8d69caSLisandro Dalcin       yy += PetscImageFontHeight;
273*2b8d69caSLisandro Dalcin       ierr = PetscTokenFind(token,&subtext);CHKERRQ(ierr);
274*2b8d69caSLisandro Dalcin     }
275*2b8d69caSLisandro Dalcin     ierr = PetscTokenDestroy(&token);CHKERRQ(ierr);
276*2b8d69caSLisandro Dalcin   }
277*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
278*2b8d69caSLisandro Dalcin }
279*2b8d69caSLisandro Dalcin 
280*2b8d69caSLisandro Dalcin #undef __FUNCT__
281*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawStringVertical_Image"
282*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawStringVertical_Image(PetscDraw draw,PetscReal x,PetscReal y,int c,const char text[])
283*2b8d69caSLisandro Dalcin {
284*2b8d69caSLisandro Dalcin   PetscImage img = (PetscImage)draw->data;
285*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
286*2b8d69caSLisandro Dalcin   PetscDrawValidColor(c);
287*2b8d69caSLisandro Dalcin   {
288*2b8d69caSLisandro Dalcin     char chr[2] = {0, 0};
289*2b8d69caSLisandro Dalcin     int  xx = XTRANS(draw,img,x);
290*2b8d69caSLisandro Dalcin     int  yy = YTRANS(draw,img,y);
291*2b8d69caSLisandro Dalcin     int  offset = PetscImageFontHeight;
292*2b8d69caSLisandro Dalcin     while ((chr[0] = *text++)) {
293*2b8d69caSLisandro Dalcin       PetscImageDrawText(img,xx,yy+offset,c,chr);
294*2b8d69caSLisandro Dalcin       yy += PetscImageFontHeight;
295*2b8d69caSLisandro Dalcin     }
296*2b8d69caSLisandro Dalcin   }
297*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
298*2b8d69caSLisandro Dalcin }
299*2b8d69caSLisandro Dalcin 
300*2b8d69caSLisandro Dalcin /*
301*2b8d69caSLisandro Dalcin #undef __FUNCT__
302*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawStringBoxed_Image"
303*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawStringBoxed_Image(PetscDraw draw,PetscReal sxl,PetscReal syl,int sc,int bc,const char text[],PetscReal *w,PetscReal *h)
304*2b8d69caSLisandro Dalcin {
305*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
306*2b8d69caSLisandro Dalcin   if (w) *w = 0;
307*2b8d69caSLisandro Dalcin   if (h) *h = 0;
308*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
309*2b8d69caSLisandro Dalcin */
310*2b8d69caSLisandro Dalcin #define PetscDrawStringBoxed_Image NULL
311*2b8d69caSLisandro Dalcin 
312*2b8d69caSLisandro Dalcin /*
313*2b8d69caSLisandro Dalcin #undef __FUNCT__
314*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawFlush_Image"
315*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawFlush_Image(PetscDraw draw)
316*2b8d69caSLisandro Dalcin {
317*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
318*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
319*2b8d69caSLisandro Dalcin }*/
320*2b8d69caSLisandro Dalcin #define PetscDrawFlush_Image NULL
321*2b8d69caSLisandro Dalcin 
322*2b8d69caSLisandro Dalcin #undef __FUNCT__
323*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawClear_Image"
324*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawClear_Image(PetscDraw draw)
325*2b8d69caSLisandro Dalcin {
326*2b8d69caSLisandro Dalcin   PetscImage     img = (PetscImage)draw->data;
327*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
328*2b8d69caSLisandro Dalcin   {
329*2b8d69caSLisandro Dalcin     PetscImageClear(img);
330*2b8d69caSLisandro Dalcin   }
331*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
332*2b8d69caSLisandro Dalcin }
333*2b8d69caSLisandro Dalcin 
334*2b8d69caSLisandro Dalcin /*
335*2b8d69caSLisandro Dalcin #undef __FUNCT__
336*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawSetDoubleBuffer_Image"
337*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawSetDoubleBuffer_Image(PetscDraw draw)
338*2b8d69caSLisandro Dalcin {
339*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
340*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
341*2b8d69caSLisandro Dalcin }*/
342*2b8d69caSLisandro Dalcin #define PetscDrawSetDoubleBuffer_Image NULL
343*2b8d69caSLisandro Dalcin 
344*2b8d69caSLisandro Dalcin #undef __FUNCT__
345*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawGetPopup_Image"
346*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawGetPopup_Image(PetscDraw draw,PetscDraw *popup)
347*2b8d69caSLisandro Dalcin {
348*2b8d69caSLisandro Dalcin   PetscBool      flg = PETSC_FALSE;
349*2b8d69caSLisandro Dalcin   PetscErrorCode ierr;
350*2b8d69caSLisandro Dalcin 
351*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
352*2b8d69caSLisandro Dalcin   ierr = PetscOptionsGetBool(((PetscObject)draw)->options,((PetscObject)draw)->prefix,"-draw_popup",&flg,NULL);CHKERRQ(ierr);
353*2b8d69caSLisandro Dalcin   if (!flg) {*popup = NULL; PetscFunctionReturn(0);}
354*2b8d69caSLisandro Dalcin   ierr = PetscDrawCreate(PetscObjectComm((PetscObject)draw),NULL,NULL,0,0,220,220,popup);CHKERRQ(ierr);
355*2b8d69caSLisandro Dalcin   ierr = PetscDrawSetType(*popup,PETSC_DRAW_IMAGE);CHKERRQ(ierr);
356*2b8d69caSLisandro Dalcin   ierr = PetscObjectSetOptionsPrefix((PetscObject)*popup,"popup_");CHKERRQ(ierr);
357*2b8d69caSLisandro Dalcin   ierr = PetscObjectAppendOptionsPrefix((PetscObject)*popup,((PetscObject)draw)->prefix);CHKERRQ(ierr);
358*2b8d69caSLisandro Dalcin   draw->popup = *popup;
359*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
360*2b8d69caSLisandro Dalcin }
361*2b8d69caSLisandro Dalcin 
362*2b8d69caSLisandro Dalcin /*
363*2b8d69caSLisandro Dalcin #undef __FUNCT__
364*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawSetTitle_Image"
365*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawSetTitle_Image(PetscDraw draw,const char title[])
366*2b8d69caSLisandro Dalcin {
367*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
368*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
369*2b8d69caSLisandro Dalcin }*/
370*2b8d69caSLisandro Dalcin #define PetscDrawSetTitle_Image NULL
371*2b8d69caSLisandro Dalcin 
372*2b8d69caSLisandro Dalcin /*
373*2b8d69caSLisandro Dalcin #undef __FUNCT__
374*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawCheckResizedWindow_Image"
375*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawCheckResizedWindow_Image(PetscDraw draw)
376*2b8d69caSLisandro Dalcin {
377*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
378*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
379*2b8d69caSLisandro Dalcin }*/
380*2b8d69caSLisandro Dalcin #define PetscDrawCheckResizedWindow_Image NULL
381*2b8d69caSLisandro Dalcin 
382*2b8d69caSLisandro Dalcin #undef __FUNCT__
383*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawResizeWindow_Image"
384*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawResizeWindow_Image(PetscDraw draw,int w,int h)
385*2b8d69caSLisandro Dalcin {
386*2b8d69caSLisandro Dalcin   PetscImage     img = (PetscImage)draw->data;
387*2b8d69caSLisandro Dalcin   PetscErrorCode ierr;
388*2b8d69caSLisandro Dalcin 
389*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
390*2b8d69caSLisandro Dalcin   if (w == img->w && h == img->h) PetscFunctionReturn(0);
391*2b8d69caSLisandro Dalcin   ierr = PetscFree(img->buffer);CHKERRQ(ierr);
392*2b8d69caSLisandro Dalcin 
393*2b8d69caSLisandro Dalcin   img->w = w; img->h = h;
394*2b8d69caSLisandro Dalcin   ierr = PetscCalloc1((size_t)(img->w*img->h),&img->buffer);CHKERRQ(ierr);
395*2b8d69caSLisandro Dalcin   ierr = PetscDrawSetViewport_Image(draw,draw->port_xl,draw->port_yl,draw->port_xr,draw->port_yr);CHKERRQ(ierr);
396*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
397*2b8d69caSLisandro Dalcin }
398*2b8d69caSLisandro Dalcin 
399*2b8d69caSLisandro Dalcin #undef __FUNCT__
400*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawDestroy_Image"
401*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawDestroy_Image(PetscDraw draw)
402*2b8d69caSLisandro Dalcin {
403*2b8d69caSLisandro Dalcin   PetscImage     img = (PetscImage)draw->data;
404*2b8d69caSLisandro Dalcin   PetscErrorCode ierr;
405*2b8d69caSLisandro Dalcin 
406*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
407*2b8d69caSLisandro Dalcin   ierr = PetscFree(img->buffer);CHKERRQ(ierr);
408*2b8d69caSLisandro Dalcin   ierr = PetscFree(draw->data);CHKERRQ(ierr);
409*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
410*2b8d69caSLisandro Dalcin }
411*2b8d69caSLisandro Dalcin 
412*2b8d69caSLisandro Dalcin /*
413*2b8d69caSLisandro Dalcin #undef __FUNCT__
414*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawView_Image"
415*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawView_Image(PetscDraw draw,PetscViewer viewer)
416*2b8d69caSLisandro Dalcin {
417*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
418*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
419*2b8d69caSLisandro Dalcin }*/
420*2b8d69caSLisandro Dalcin #define PetscDrawView_Image NULL
421*2b8d69caSLisandro Dalcin 
422*2b8d69caSLisandro Dalcin /*
423*2b8d69caSLisandro Dalcin #undef __FUNCT__
424*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawGetMouseButton_Image"
425*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawGetMouseButton_Image(PetscDraw draw,PetscDrawButton *button,PetscReal *x_user,PetscReal *y_user,PetscReal *x_phys,PetscReal *y_phys)
426*2b8d69caSLisandro Dalcin {
427*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
428*2b8d69caSLisandro Dalcin   *button = PETSC_BUTTON_NONE;
429*2b8d69caSLisandro Dalcin   if (x_user) *x_user = 0;
430*2b8d69caSLisandro Dalcin   if (y_user) *y_user = 0;
431*2b8d69caSLisandro Dalcin   if (x_phys) *x_phys = 0;
432*2b8d69caSLisandro Dalcin   if (y_phys) *y_phys = 0;
433*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
434*2b8d69caSLisandro Dalcin }*/
435*2b8d69caSLisandro Dalcin #define PetscDrawGetMouseButton_Image NULL
436*2b8d69caSLisandro Dalcin 
437*2b8d69caSLisandro Dalcin /*
438*2b8d69caSLisandro Dalcin #undef __FUNCT__
439*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawPause_Image"
440*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawPause_Image(PetscDraw draw)
441*2b8d69caSLisandro Dalcin {
442*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
443*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
444*2b8d69caSLisandro Dalcin }*/
445*2b8d69caSLisandro Dalcin #define PetscDrawPause_Image NULL
446*2b8d69caSLisandro Dalcin 
447*2b8d69caSLisandro Dalcin /*
448*2b8d69caSLisandro Dalcin #undef __FUNCT__
449*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawBeginPage_Image"
450*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawBeginPage_Image(PetscDraw draw)
451*2b8d69caSLisandro Dalcin {
452*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
453*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
454*2b8d69caSLisandro Dalcin }*/
455*2b8d69caSLisandro Dalcin #define PetscDrawBeginPage_Image NULL
456*2b8d69caSLisandro Dalcin 
457*2b8d69caSLisandro Dalcin /*
458*2b8d69caSLisandro Dalcin #undef __FUNCT__
459*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawEndPage_Image"
460*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawEndPage_Image(PetscDraw draw)
461*2b8d69caSLisandro Dalcin {
462*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
463*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
464*2b8d69caSLisandro Dalcin }*/
465*2b8d69caSLisandro Dalcin #define PetscDrawEndPage_Image NULL
466*2b8d69caSLisandro Dalcin 
467*2b8d69caSLisandro Dalcin #undef __FUNCT__
468*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawGetSingleton_Image"
469*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawGetSingleton_Image(PetscDraw draw,PetscDraw *sdraw)
470*2b8d69caSLisandro Dalcin {
471*2b8d69caSLisandro Dalcin   PetscImage     pimg = (PetscImage)draw->data;
472*2b8d69caSLisandro Dalcin   PetscImage     simg;
473*2b8d69caSLisandro Dalcin   PetscErrorCode ierr;
474*2b8d69caSLisandro Dalcin 
475*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
476*2b8d69caSLisandro Dalcin   ierr = PetscDrawCreate(PETSC_COMM_SELF,NULL,NULL,0,0,draw->w,draw->h,sdraw);CHKERRQ(ierr);
477*2b8d69caSLisandro Dalcin   ierr = PetscDrawSetType(*sdraw,PETSC_DRAW_IMAGE);CHKERRQ(ierr);
478*2b8d69caSLisandro Dalcin   (*sdraw)->ops->resizewindow = NULL;
479*2b8d69caSLisandro Dalcin   simg = (PetscImage)(*sdraw)->data;
480*2b8d69caSLisandro Dalcin   ierr = PetscMemcpy(simg->buffer,pimg->buffer,(size_t)(pimg->w*pimg->h));CHKERRQ(ierr);
481*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
482*2b8d69caSLisandro Dalcin }
483*2b8d69caSLisandro Dalcin 
484*2b8d69caSLisandro Dalcin #undef __FUNCT__
485*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawRestoreSingleton_Image"
486*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawRestoreSingleton_Image(PetscDraw draw,PetscDraw *sdraw)
487*2b8d69caSLisandro Dalcin {
488*2b8d69caSLisandro Dalcin   PetscImage     pimg = (PetscImage)draw->data;
489*2b8d69caSLisandro Dalcin   PetscImage     simg = (PetscImage)(*sdraw)->data;
490*2b8d69caSLisandro Dalcin   PetscErrorCode ierr;
491*2b8d69caSLisandro Dalcin 
492*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
493*2b8d69caSLisandro Dalcin   ierr = PetscMemcpy(pimg->buffer,simg->buffer,(size_t)(pimg->w*pimg->h));CHKERRQ(ierr);
494*2b8d69caSLisandro Dalcin   ierr = PetscDrawDestroy(sdraw);CHKERRQ(ierr);
495*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
496*2b8d69caSLisandro Dalcin }
497*2b8d69caSLisandro Dalcin 
498*2b8d69caSLisandro Dalcin /*
499*2b8d69caSLisandro Dalcin #undef __FUNCT__
500*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawSave_Image"
501*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawSave_Image(PetscDraw draw)
502*2b8d69caSLisandro Dalcin {
503*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
504*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
505*2b8d69caSLisandro Dalcin }*/
506*2b8d69caSLisandro Dalcin #define PetscDrawSave_Image NULL
507*2b8d69caSLisandro Dalcin 
508*2b8d69caSLisandro Dalcin #undef __FUNCT__
509*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawGetImage_Image"
510*2b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawGetImage_Image(PetscDraw draw,unsigned char palette[256][3],unsigned int *w,unsigned int *h,unsigned char *pixels[])
511*2b8d69caSLisandro Dalcin {
512*2b8d69caSLisandro Dalcin   PetscImage     img = (PetscImage)draw->data;
513*2b8d69caSLisandro Dalcin   unsigned char  *buffer = NULL;
514*2b8d69caSLisandro Dalcin   PetscMPIInt    rank,size;
515*2b8d69caSLisandro Dalcin   PetscErrorCode ierr;
516*2b8d69caSLisandro Dalcin 
517*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
518*2b8d69caSLisandro Dalcin   if (w) *w = (unsigned int)img->w;
519*2b8d69caSLisandro Dalcin   if (h) *h = (unsigned int)img->h;
520*2b8d69caSLisandro Dalcin   if (pixels) *pixels = NULL;
521*2b8d69caSLisandro Dalcin   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)draw),&rank);CHKERRQ(ierr);
522*2b8d69caSLisandro Dalcin   if (!rank) {
523*2b8d69caSLisandro Dalcin     ierr = PetscMemcpy(palette,img->palette,sizeof(img->palette));CHKERRQ(ierr);
524*2b8d69caSLisandro Dalcin     ierr = PetscMalloc1((size_t)(img->w*img->h),&buffer);CHKERRQ(ierr);
525*2b8d69caSLisandro Dalcin     *pixels = buffer;
526*2b8d69caSLisandro Dalcin   }
527*2b8d69caSLisandro Dalcin   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)draw),&size);CHKERRQ(ierr);
528*2b8d69caSLisandro Dalcin   if (size == 1) {
529*2b8d69caSLisandro Dalcin     ierr = PetscMemcpy(buffer,img->buffer,(size_t)(img->w*img->h));CHKERRQ(ierr);
530*2b8d69caSLisandro Dalcin   } else {
531*2b8d69caSLisandro Dalcin     ierr = MPI_Reduce(img->buffer,buffer,img->w*img->h,MPI_UNSIGNED_CHAR,MPI_MAX,0,PetscObjectComm((PetscObject)draw));CHKERRQ(ierr);
532*2b8d69caSLisandro Dalcin   }
533*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
534*2b8d69caSLisandro Dalcin }
535*2b8d69caSLisandro Dalcin 
536*2b8d69caSLisandro Dalcin static struct _PetscDrawOps DvOps = {
537*2b8d69caSLisandro Dalcin   PetscDrawSetDoubleBuffer_Image,
538*2b8d69caSLisandro Dalcin   PetscDrawFlush_Image,
539*2b8d69caSLisandro Dalcin   PetscDrawLine_Image,
540*2b8d69caSLisandro Dalcin   PetscDrawLineSetWidth_Image,
541*2b8d69caSLisandro Dalcin   PetscDrawLineGetWidth_Image,
542*2b8d69caSLisandro Dalcin   PetscDrawPoint_Image,
543*2b8d69caSLisandro Dalcin   PetscDrawPointSetSize_Image,
544*2b8d69caSLisandro Dalcin   PetscDrawString_Image,
545*2b8d69caSLisandro Dalcin   PetscDrawStringVertical_Image,
546*2b8d69caSLisandro Dalcin   PetscDrawStringSetSize_Image,
547*2b8d69caSLisandro Dalcin   PetscDrawStringGetSize_Image,
548*2b8d69caSLisandro Dalcin   PetscDrawSetViewport_Image,
549*2b8d69caSLisandro Dalcin   PetscDrawClear_Image,
550*2b8d69caSLisandro Dalcin   PetscDrawRectangle_Image,
551*2b8d69caSLisandro Dalcin   PetscDrawTriangle_Image,
552*2b8d69caSLisandro Dalcin   PetscDrawEllipse_Image,
553*2b8d69caSLisandro Dalcin   PetscDrawGetMouseButton_Image,
554*2b8d69caSLisandro Dalcin   PetscDrawPause_Image,
555*2b8d69caSLisandro Dalcin   PetscDrawBeginPage_Image,
556*2b8d69caSLisandro Dalcin   PetscDrawEndPage_Image,
557*2b8d69caSLisandro Dalcin   PetscDrawGetPopup_Image,
558*2b8d69caSLisandro Dalcin   PetscDrawSetTitle_Image,
559*2b8d69caSLisandro Dalcin   PetscDrawCheckResizedWindow_Image,
560*2b8d69caSLisandro Dalcin   PetscDrawResizeWindow_Image,
561*2b8d69caSLisandro Dalcin   PetscDrawDestroy_Image,
562*2b8d69caSLisandro Dalcin   PetscDrawView_Image,
563*2b8d69caSLisandro Dalcin   PetscDrawGetSingleton_Image,
564*2b8d69caSLisandro Dalcin   PetscDrawRestoreSingleton_Image,
565*2b8d69caSLisandro Dalcin   PetscDrawSave_Image,
566*2b8d69caSLisandro Dalcin   PetscDrawGetImage_Image,
567*2b8d69caSLisandro Dalcin   PetscDrawSetCoordinates_Image,
568*2b8d69caSLisandro Dalcin   PetscDrawArrow_Image,
569*2b8d69caSLisandro Dalcin   PetscDrawCoordinateToPixel_Image,
570*2b8d69caSLisandro Dalcin   PetscDrawPixelToCoordinate_Image,
571*2b8d69caSLisandro Dalcin   PetscDrawPointPixel_Image,
572*2b8d69caSLisandro Dalcin   PetscDrawStringBoxed_Image
573*2b8d69caSLisandro Dalcin };
574*2b8d69caSLisandro Dalcin 
575*2b8d69caSLisandro Dalcin static const unsigned char BasicColors[PETSC_DRAW_BASIC_COLORS][3] = {
576*2b8d69caSLisandro Dalcin   { 255, 255, 255 }, /* white */
577*2b8d69caSLisandro Dalcin   {   0,   0,   0 }, /* black */
578*2b8d69caSLisandro Dalcin   { 255,   0,   0 }, /* red */
579*2b8d69caSLisandro Dalcin   {   0, 255,   0 }, /* green */
580*2b8d69caSLisandro Dalcin   {   0, 255, 255 }, /* cyan */
581*2b8d69caSLisandro Dalcin   {   0,   0, 255 }, /* blue */
582*2b8d69caSLisandro Dalcin   { 255,   0, 255 }, /* magenta */
583*2b8d69caSLisandro Dalcin   { 127, 255, 212 }, /* aquamarine */
584*2b8d69caSLisandro Dalcin   {  34, 139,  34 }, /* forestgreen */
585*2b8d69caSLisandro Dalcin   { 255, 165,   0 }, /* orange */
586*2b8d69caSLisandro Dalcin   { 238, 130, 238 }, /* violet */
587*2b8d69caSLisandro Dalcin   { 165,  42,  42 }, /* brown */
588*2b8d69caSLisandro Dalcin   { 255, 192, 203 }, /* pink */
589*2b8d69caSLisandro Dalcin   { 255, 127,  80 }, /* coral */
590*2b8d69caSLisandro Dalcin   { 190, 190, 190 }, /* gray */
591*2b8d69caSLisandro Dalcin   { 255, 255,   0 }, /* yellow */
592*2b8d69caSLisandro Dalcin   { 255, 215,   0 }, /* gold */
593*2b8d69caSLisandro Dalcin   { 255, 182, 193 }, /* lightpink */
594*2b8d69caSLisandro Dalcin   {  72, 209, 204 }, /* mediumturquoise */
595*2b8d69caSLisandro Dalcin   { 240, 230, 140 }, /* khaki */
596*2b8d69caSLisandro Dalcin   { 105, 105, 105 }, /* dimgray */
597*2b8d69caSLisandro Dalcin   {  54, 205,  50 }, /* yellowgreen */
598*2b8d69caSLisandro Dalcin   { 135, 206, 235 }, /* skyblue */
599*2b8d69caSLisandro Dalcin   {   0, 100,   0 }, /* darkgreen */
600*2b8d69caSLisandro Dalcin   {   0,   0, 128 }, /* navyblue */
601*2b8d69caSLisandro Dalcin   { 244, 164,  96 }, /* sandybrown */
602*2b8d69caSLisandro Dalcin   {  95, 158, 160 }, /* cadetblue */
603*2b8d69caSLisandro Dalcin   { 176, 224, 230 }, /* powderblue */
604*2b8d69caSLisandro Dalcin   { 255,  20, 147 }, /* deeppink */
605*2b8d69caSLisandro Dalcin   { 216, 191, 216 }, /* thistle */
606*2b8d69caSLisandro Dalcin   {  50, 205,  50 }, /* limegreen */
607*2b8d69caSLisandro Dalcin   { 255, 240, 245 }, /* lavenderblush */
608*2b8d69caSLisandro Dalcin   { 221, 160, 221 }, /* plum */
609*2b8d69caSLisandro Dalcin };
610*2b8d69caSLisandro Dalcin 
611*2b8d69caSLisandro Dalcin 
612*2b8d69caSLisandro Dalcin /*MC
613*2b8d69caSLisandro Dalcin    PETSC_DRAW_IMAGE - PETSc graphics device that uses a raster buffer
614*2b8d69caSLisandro Dalcin 
615*2b8d69caSLisandro Dalcin    Options Database Keys:
616*2b8d69caSLisandro Dalcin .  -draw_size w,h - size of image in pixels
617*2b8d69caSLisandro Dalcin 
618*2b8d69caSLisandro Dalcin    Level: beginner
619*2b8d69caSLisandro Dalcin 
620*2b8d69caSLisandro Dalcin .seealso:  PetscDrawOpenImage(), PetscDrawSetFromOptions()
621*2b8d69caSLisandro Dalcin M*/
622*2b8d69caSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscDrawCreate_Image(PetscDraw);
623*2b8d69caSLisandro Dalcin 
624*2b8d69caSLisandro Dalcin #undef __FUNCT__
625*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawCreate_Image"
626*2b8d69caSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscDrawCreate_Image(PetscDraw draw)
627*2b8d69caSLisandro Dalcin {
628*2b8d69caSLisandro Dalcin   PetscImage     img;
629*2b8d69caSLisandro Dalcin   int            w = draw->w, h = draw->h;
630*2b8d69caSLisandro Dalcin   PetscInt       size[2], nsize = 2;
631*2b8d69caSLisandro Dalcin   PetscBool      set;
632*2b8d69caSLisandro Dalcin   PetscErrorCode ierr;
633*2b8d69caSLisandro Dalcin 
634*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
635*2b8d69caSLisandro Dalcin   draw->pause   = 0;
636*2b8d69caSLisandro Dalcin   draw->coor_xl = 0; draw->coor_xr = 1;
637*2b8d69caSLisandro Dalcin   draw->coor_yl = 0; draw->coor_yr = 1;
638*2b8d69caSLisandro Dalcin   draw->port_xl = 0; draw->port_xr = 1;
639*2b8d69caSLisandro Dalcin   draw->port_yl = 0; draw->port_yr = 1;
640*2b8d69caSLisandro Dalcin   ierr = PetscDrawDestroy(&draw->popup);CHKERRQ(ierr);
641*2b8d69caSLisandro Dalcin 
642*2b8d69caSLisandro Dalcin   size[0] = w; if (size[0] < 1) size[0] = 300;
643*2b8d69caSLisandro Dalcin   size[1] = h; if (size[1] < 1) size[1] = size[0];
644*2b8d69caSLisandro Dalcin   ierr = PetscOptionsGetIntArray(((PetscObject)draw)->options,((PetscObject)draw)->prefix,"-draw_size",size,&nsize,&set);CHKERRQ(ierr);
645*2b8d69caSLisandro Dalcin   if (set && nsize == 1) size[1] = size[0];
646*2b8d69caSLisandro Dalcin   if (size[0] < 1) size[0] = 300;
647*2b8d69caSLisandro Dalcin   if (size[1] < 1) size[1] = size[0];
648*2b8d69caSLisandro Dalcin   draw->w = w = size[0]; draw->x = 0;
649*2b8d69caSLisandro Dalcin   draw->h = h = size[1]; draw->x = 0;
650*2b8d69caSLisandro Dalcin 
651*2b8d69caSLisandro Dalcin   ierr = PetscNewLog(draw,&img);CHKERRQ(ierr);
652*2b8d69caSLisandro Dalcin   ierr = PetscMemcpy(draw->ops,&DvOps,sizeof(DvOps));CHKERRQ(ierr);
653*2b8d69caSLisandro Dalcin   draw->data = (void*)img;
654*2b8d69caSLisandro Dalcin 
655*2b8d69caSLisandro Dalcin   img->w = w; img->h = h;
656*2b8d69caSLisandro Dalcin   ierr = PetscCalloc1((size_t)(img->w*img->h),&img->buffer);CHKERRQ(ierr);
657*2b8d69caSLisandro Dalcin   PetscImageSetClip(img,0,0,img->w,img->h);
658*2b8d69caSLisandro Dalcin   {
659*2b8d69caSLisandro Dalcin     int i,k,ncolors = 256-PETSC_DRAW_BASIC_COLORS;
660*2b8d69caSLisandro Dalcin     unsigned char R[256-PETSC_DRAW_BASIC_COLORS];
661*2b8d69caSLisandro Dalcin     unsigned char G[256-PETSC_DRAW_BASIC_COLORS];
662*2b8d69caSLisandro Dalcin     unsigned char B[256-PETSC_DRAW_BASIC_COLORS];
663*2b8d69caSLisandro Dalcin     ierr = PetscDrawUtilitySetCmap(NULL,ncolors,R,G,B);CHKERRQ(ierr);
664*2b8d69caSLisandro Dalcin     for (k=0; k<PETSC_DRAW_BASIC_COLORS; k++) {
665*2b8d69caSLisandro Dalcin       img->palette[k][0] = BasicColors[k][0];
666*2b8d69caSLisandro Dalcin       img->palette[k][1] = BasicColors[k][1];
667*2b8d69caSLisandro Dalcin       img->palette[k][2] = BasicColors[k][2];
668*2b8d69caSLisandro Dalcin     }
669*2b8d69caSLisandro Dalcin     for (i=0; i<ncolors; i++, k++) {
670*2b8d69caSLisandro Dalcin       img->palette[k][0] = R[i];
671*2b8d69caSLisandro Dalcin       img->palette[k][1] = G[i];
672*2b8d69caSLisandro Dalcin       img->palette[k][2] = B[i];
673*2b8d69caSLisandro Dalcin     }
674*2b8d69caSLisandro Dalcin   }
675*2b8d69caSLisandro Dalcin 
676*2b8d69caSLisandro Dalcin   if (!draw->savefilename ){ierr = PetscDrawSetSave(draw,"");CHKERRQ(ierr);}
677*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
678*2b8d69caSLisandro Dalcin }
679*2b8d69caSLisandro Dalcin 
680*2b8d69caSLisandro Dalcin #undef __FUNCT__
681*2b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawOpenImage"
682*2b8d69caSLisandro Dalcin /*@C
683*2b8d69caSLisandro Dalcin    PetscDrawOpenImage - Opens an image for use with the PetscDraw routines.
684*2b8d69caSLisandro Dalcin 
685*2b8d69caSLisandro Dalcin    Collective on MPI_Comm
686*2b8d69caSLisandro Dalcin 
687*2b8d69caSLisandro Dalcin    Input Parameters:
688*2b8d69caSLisandro Dalcin +  comm - the communicator that will share image
689*2b8d69caSLisandro Dalcin -  filename - optional name of the file
690*2b8d69caSLisandro Dalcin -  w, h - the image width and height in pixels
691*2b8d69caSLisandro Dalcin 
692*2b8d69caSLisandro Dalcin    Output Parameters:
693*2b8d69caSLisandro Dalcin .  draw - the drawing context.
694*2b8d69caSLisandro Dalcin 
695*2b8d69caSLisandro Dalcin    Level: beginner
696*2b8d69caSLisandro Dalcin 
697*2b8d69caSLisandro Dalcin .seealso: PetscDrawSetSave(), PetscDrawSetFromOptions(), PetscDrawCreate(), PetscDrawDestroy()
698*2b8d69caSLisandro Dalcin @*/
699*2b8d69caSLisandro Dalcin PetscErrorCode PetscDrawOpenImage(MPI_Comm comm,const char filename[],int w,int h,PetscDraw *draw)
700*2b8d69caSLisandro Dalcin {
701*2b8d69caSLisandro Dalcin   PetscErrorCode ierr;
702*2b8d69caSLisandro Dalcin 
703*2b8d69caSLisandro Dalcin   PetscFunctionBegin;
704*2b8d69caSLisandro Dalcin   ierr = PetscDrawCreate(comm,NULL,NULL,0,0,w,h,draw);CHKERRQ(ierr);
705*2b8d69caSLisandro Dalcin   ierr = PetscDrawSetType(*draw,PETSC_DRAW_IMAGE);CHKERRQ(ierr);
706*2b8d69caSLisandro Dalcin   ierr = PetscDrawSetSave(*draw,filename);CHKERRQ(ierr);
707*2b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
708*2b8d69caSLisandro Dalcin }
709