xref: /petsc/src/sys/classes/draw/impls/image/drawimage.c (revision a7e8706a476e2c77fccf20041dd82cd54aa347de)
12b8d69caSLisandro Dalcin #include <../src/sys/classes/draw/impls/image/drawimage.h>   /*I  "petscdraw.h" I*/
22b8d69caSLisandro Dalcin #include <petsc/private/drawimpl.h>                          /*I  "petscdraw.h" I*/
32b8d69caSLisandro Dalcin 
42b8d69caSLisandro Dalcin #if defined(PETSC_USE_DEBUG)
52b8d69caSLisandro Dalcin #define PetscDrawValidColor(color) \
62b8d69caSLisandro 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)
72b8d69caSLisandro Dalcin #else
82b8d69caSLisandro Dalcin #define PetscDrawValidColor(color) do {} while (0)
92b8d69caSLisandro Dalcin #endif
102b8d69caSLisandro Dalcin 
112b8d69caSLisandro 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)))))
122b8d69caSLisandro 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)))))
132b8d69caSLisandro Dalcin 
142b8d69caSLisandro 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))
152b8d69caSLisandro 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))
162b8d69caSLisandro Dalcin 
172b8d69caSLisandro Dalcin 
182b8d69caSLisandro Dalcin #undef __FUNCT__
192b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawSetViewport_Image"
202b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawSetViewport_Image(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr)
212b8d69caSLisandro Dalcin {
222b8d69caSLisandro Dalcin   PetscImage img = (PetscImage)draw->data;
232b8d69caSLisandro Dalcin   PetscFunctionBegin;
242b8d69caSLisandro Dalcin   {
252b8d69caSLisandro Dalcin     int xmax = img->w - 1,   ymax = img->h - 1;
262b8d69caSLisandro Dalcin     int xa = (int)(xl*xmax), ya = ymax - (int)(yr*ymax);
272b8d69caSLisandro Dalcin     int xb = (int)(xr*xmax), yb = ymax - (int)(yl*ymax);
282b8d69caSLisandro Dalcin     PetscImageSetClip(img,xa,ya,xb+1-xa,yb+1-ya);
292b8d69caSLisandro Dalcin   }
302b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
312b8d69caSLisandro Dalcin }
322b8d69caSLisandro Dalcin 
332b8d69caSLisandro Dalcin /*
342b8d69caSLisandro Dalcin #undef __FUNCT__
352b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawSetCoordinates_Image"
362b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawSetCoordinates_Image(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr)
372b8d69caSLisandro Dalcin {
382b8d69caSLisandro Dalcin   PetscFunctionBegin;
392b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
402b8d69caSLisandro Dalcin }*/
412b8d69caSLisandro Dalcin #define PetscDrawSetCoordinates_Image NULL
422b8d69caSLisandro Dalcin 
432b8d69caSLisandro Dalcin #undef __FUNCT__
442b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawCoordinateToPixel_Image"
45*a7e8706aSLisandro Dalcin static PetscErrorCode PetscDrawCoordinateToPixel_Image(PetscDraw draw,PetscReal x,PetscReal y,int *i,int *j)
462b8d69caSLisandro Dalcin {
472b8d69caSLisandro Dalcin   PetscImage img = (PetscImage)draw->data;
482b8d69caSLisandro Dalcin   PetscFunctionBegin;
492b8d69caSLisandro Dalcin   if (i) *i = XTRANS(draw,img,x);
502b8d69caSLisandro Dalcin   if (j) *j = YTRANS(draw,img,y);
512b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
522b8d69caSLisandro Dalcin }
532b8d69caSLisandro Dalcin 
542b8d69caSLisandro Dalcin #undef __FUNCT__
552b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawPixelToCoordinate_Image"
56*a7e8706aSLisandro Dalcin static PetscErrorCode PetscDrawPixelToCoordinate_Image(PetscDraw draw,int i,int j,PetscReal *x,PetscReal *y)
572b8d69caSLisandro Dalcin {
582b8d69caSLisandro Dalcin   PetscImage img = (PetscImage)draw->data;
592b8d69caSLisandro Dalcin   PetscFunctionBegin;
602b8d69caSLisandro Dalcin   if (x) *x = ITRANS(draw,img,i);
612b8d69caSLisandro Dalcin   if (y) *y = JTRANS(draw,img,j);
622b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
632b8d69caSLisandro Dalcin }
642b8d69caSLisandro Dalcin 
652b8d69caSLisandro Dalcin /*
662b8d69caSLisandro Dalcin #undef __FUNCT__
672b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawPointSetSize_Image"
682b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawPointSetSize_Image(PetscDraw draw,PetscReal width)
692b8d69caSLisandro Dalcin {
702b8d69caSLisandro Dalcin   PetscFunctionBegin;
712b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
722b8d69caSLisandro Dalcin }*/
732b8d69caSLisandro Dalcin #define PetscDrawPointSetSize_Image NULL
742b8d69caSLisandro Dalcin 
752b8d69caSLisandro Dalcin #undef __FUNCT__
762b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawPoint_Image"
772b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawPoint_Image(PetscDraw draw,PetscReal x,PetscReal y,int c)
782b8d69caSLisandro Dalcin {
792b8d69caSLisandro Dalcin   PetscImage img = (PetscImage)draw->data;
802b8d69caSLisandro Dalcin   PetscFunctionBegin;
812b8d69caSLisandro Dalcin   PetscDrawValidColor(c);
822b8d69caSLisandro Dalcin   {
832b8d69caSLisandro Dalcin     int j, xx = XTRANS(draw,img,x);
842b8d69caSLisandro Dalcin     int i, yy = YTRANS(draw,img,y);
852b8d69caSLisandro Dalcin     for (i=-1; i<=1; i++)
862b8d69caSLisandro Dalcin       for (j=-1; j<=1; j++)
872b8d69caSLisandro Dalcin         PetscImageDrawPixel(img,xx+j,yy+i,c);
882b8d69caSLisandro Dalcin   }
892b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
902b8d69caSLisandro Dalcin }
912b8d69caSLisandro Dalcin 
922b8d69caSLisandro Dalcin #undef __FUNCT__
932b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawPointPixel_Image"
94*a7e8706aSLisandro Dalcin static PetscErrorCode PetscDrawPointPixel_Image(PetscDraw draw,int x,int y,int c)
952b8d69caSLisandro Dalcin {
962b8d69caSLisandro Dalcin   PetscImage img = (PetscImage)draw->data;
972b8d69caSLisandro Dalcin   PetscFunctionBegin;
982b8d69caSLisandro Dalcin   PetscDrawValidColor(c);
992b8d69caSLisandro Dalcin   {
100*a7e8706aSLisandro Dalcin     PetscImageDrawPixel(img,x,y,c);
1012b8d69caSLisandro Dalcin   }
1022b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
1032b8d69caSLisandro Dalcin }
1042b8d69caSLisandro Dalcin 
1052b8d69caSLisandro Dalcin /*
1062b8d69caSLisandro Dalcin #undef __FUNCT__
1072b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawLineSetWidth_Image"
1082b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawLineSetWidth_Image(PetscDraw draw,PetscReal width)
1092b8d69caSLisandro Dalcin {
1102b8d69caSLisandro Dalcin   PetscFunctionBegin;
1112b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
1122b8d69caSLisandro Dalcin }*/
1132b8d69caSLisandro Dalcin #define PetscDrawLineSetWidth_Image NULL
1142b8d69caSLisandro Dalcin 
1152b8d69caSLisandro Dalcin #undef __FUNCT__
1162b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawLineGetWidth_Image"
1172b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawLineGetWidth_Image(PetscDraw draw,PetscReal *width)
1182b8d69caSLisandro Dalcin {
1192b8d69caSLisandro Dalcin   PetscImage img = (PetscImage)draw->data;
1202b8d69caSLisandro Dalcin   PetscFunctionBegin;
1212b8d69caSLisandro Dalcin   {
1222b8d69caSLisandro Dalcin     int lw = 1;
1232b8d69caSLisandro Dalcin     *width = lw*(draw->coor_xr - draw->coor_xl)/(img->w*(draw->port_xr - draw->port_xl));
1242b8d69caSLisandro Dalcin   }
1252b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
1262b8d69caSLisandro Dalcin }
1272b8d69caSLisandro Dalcin 
1282b8d69caSLisandro Dalcin #undef __FUNCT__
1292b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawLine_Image"
1302b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawLine_Image(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr,int c)
1312b8d69caSLisandro Dalcin {
1322b8d69caSLisandro Dalcin   PetscImage img = (PetscImage)draw->data;
1332b8d69caSLisandro Dalcin   PetscFunctionBegin;
1342b8d69caSLisandro Dalcin   {
1352b8d69caSLisandro Dalcin     int x_1 = XTRANS(draw,img,xl), x_2 = XTRANS(draw,img,xr);
1362b8d69caSLisandro Dalcin     int y_1 = YTRANS(draw,img,yl), y_2 = YTRANS(draw,img,yr);
1372b8d69caSLisandro Dalcin     PetscImageDrawLine(img,x_1,y_1,x_2,y_2,c);
1382b8d69caSLisandro Dalcin   }
1392b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
1402b8d69caSLisandro Dalcin }
1412b8d69caSLisandro Dalcin 
1422b8d69caSLisandro Dalcin #undef __FUNCT__
1432b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawArrow_Image"
1442b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawArrow_Image(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr,int c)
1452b8d69caSLisandro Dalcin {
1462b8d69caSLisandro Dalcin   PetscImage img = (PetscImage)draw->data;
1472b8d69caSLisandro Dalcin   PetscFunctionBegin;
1482b8d69caSLisandro Dalcin   PetscDrawValidColor(c);
1492b8d69caSLisandro Dalcin   {
1502b8d69caSLisandro Dalcin     int x_1 = XTRANS(draw,img,xl), x_2 = XTRANS(draw,img,xr);
1512b8d69caSLisandro Dalcin     int y_1 = YTRANS(draw,img,yl), y_2 = YTRANS(draw,img,yr);
1522b8d69caSLisandro Dalcin     if (x_1 == x_2 && y_1 == y_2) PetscFunctionReturn(0);
1532b8d69caSLisandro Dalcin     PetscImageDrawLine(img,x_1,y_1,x_2,y_2,c);
1542b8d69caSLisandro Dalcin     if (x_1 == x_2 && PetscAbs(y_1 - y_2) > 7) {
1552b8d69caSLisandro Dalcin       if (y_2 > y_1) {
1562b8d69caSLisandro Dalcin         PetscImageDrawLine(img,x_2,y_2,x_2-3,y_2-3,c);
1572b8d69caSLisandro Dalcin         PetscImageDrawLine(img,x_2,y_2,x_2+3,y_2-3,c);
1582b8d69caSLisandro Dalcin       } else {
1592b8d69caSLisandro Dalcin         PetscImageDrawLine(img,x_2,y_2,x_2-3,y_2+3,c);
1602b8d69caSLisandro Dalcin         PetscImageDrawLine(img,x_2,y_2,x_2+3,y_2+3,c);
1612b8d69caSLisandro Dalcin       }
1622b8d69caSLisandro Dalcin     }
1632b8d69caSLisandro Dalcin     if (y_1 == y_2 && PetscAbs(x_1 - x_2) > 7) {
1642b8d69caSLisandro Dalcin       if (x_2 > x_1) {
1652b8d69caSLisandro Dalcin         PetscImageDrawLine(img,x_2-3,y_2-3,x_2,y_2,c);
1662b8d69caSLisandro Dalcin         PetscImageDrawLine(img,x_2-3,y_2+3,x_2,y_2,c);
1672b8d69caSLisandro Dalcin       } else {
1682b8d69caSLisandro Dalcin         PetscImageDrawLine(img,x_2,y_2,x_2+3,y_2-3,c);
1692b8d69caSLisandro Dalcin         PetscImageDrawLine(img,x_2,y_2,x_2+3,y_2+3,c);
1702b8d69caSLisandro Dalcin       }
1712b8d69caSLisandro Dalcin     }
1722b8d69caSLisandro Dalcin    }
1732b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
1742b8d69caSLisandro Dalcin }
1752b8d69caSLisandro Dalcin 
1762b8d69caSLisandro Dalcin #undef __FUNCT__
1772b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawRectangle_Image"
1782b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawRectangle_Image(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr,int c1,int c2,int c3,int c4)
1792b8d69caSLisandro Dalcin {
1802b8d69caSLisandro Dalcin   PetscImage img = (PetscImage)draw->data;
1812b8d69caSLisandro Dalcin   PetscFunctionBegin;
1822b8d69caSLisandro Dalcin   PetscDrawValidColor(c1);
1832b8d69caSLisandro Dalcin   PetscDrawValidColor(c2);
1842b8d69caSLisandro Dalcin   PetscDrawValidColor(c3);
1852b8d69caSLisandro Dalcin   PetscDrawValidColor(c4);
1862b8d69caSLisandro Dalcin   {
1872b8d69caSLisandro Dalcin     int x = XTRANS(draw,img,xl), w = XTRANS(draw,img,xr) + 1 - x;
1882b8d69caSLisandro Dalcin     int y = YTRANS(draw,img,yr), h = YTRANS(draw,img,yl) + 1 - y;
1892b8d69caSLisandro Dalcin     int c  = (c1 + c2 + c3 + c4)/4;
1902b8d69caSLisandro Dalcin     PetscImageDrawRectangle(img,x,y,w,h,c);
1912b8d69caSLisandro Dalcin   }
1922b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
1932b8d69caSLisandro Dalcin }
1942b8d69caSLisandro Dalcin 
1952b8d69caSLisandro Dalcin #undef __FUNCT__
1962b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawEllipse_Image"
1972b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawEllipse_Image(PetscDraw draw,PetscReal x,PetscReal y,PetscReal a,PetscReal b,int c)
1982b8d69caSLisandro Dalcin {
1992b8d69caSLisandro Dalcin   PetscImage img = (PetscImage)draw->data;
2002b8d69caSLisandro Dalcin   PetscFunctionBegin;
2012b8d69caSLisandro Dalcin   PetscDrawValidColor(c);
2022b8d69caSLisandro Dalcin   a = PetscAbsReal(a);
2032b8d69caSLisandro Dalcin   b = PetscAbsReal(b);
2042b8d69caSLisandro Dalcin   {
2052b8d69caSLisandro Dalcin     int xc = XTRANS(draw,img,x), w = XTRANS(draw,img,x + a/2) + 0 - xc;
2062b8d69caSLisandro Dalcin     int yc = YTRANS(draw,img,y), h = YTRANS(draw,img,y - b/2) + 0 - yc;
2072b8d69caSLisandro Dalcin     if (PetscAbsReal(a-b) <= 0)  w = h = PetscMin(w,h); /* workaround truncation errors */
2082b8d69caSLisandro Dalcin     PetscImageDrawEllipse(img,xc,yc,w,h,c);
2092b8d69caSLisandro Dalcin   }
2102b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
2112b8d69caSLisandro Dalcin }
2122b8d69caSLisandro Dalcin 
2132b8d69caSLisandro Dalcin #undef __FUNCT__
2142b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawTriangle_Image"
2152b8d69caSLisandro 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)
2162b8d69caSLisandro Dalcin {
2172b8d69caSLisandro Dalcin   PetscImage img = (PetscImage)draw->data;
2182b8d69caSLisandro Dalcin   PetscFunctionBegin;
2192b8d69caSLisandro Dalcin   PetscDrawValidColor(c1);
2202b8d69caSLisandro Dalcin   PetscDrawValidColor(c2);
2212b8d69caSLisandro Dalcin   PetscDrawValidColor(c3);
2222b8d69caSLisandro Dalcin   {
2232b8d69caSLisandro Dalcin     int x_1 = XTRANS(draw,img,X_1), x_2 = XTRANS(draw,img,X_2), x_3 = XTRANS(draw,img,X_3);
2242b8d69caSLisandro Dalcin     int y_1 = YTRANS(draw,img,Y_1), y_2 = YTRANS(draw,img,Y_2), y_3 = YTRANS(draw,img,Y_3);
2252b8d69caSLisandro Dalcin     PetscImageDrawTriangle(img,x_1,y_1,c1,x_2,y_2,c2,x_3,y_3,c3);
2262b8d69caSLisandro Dalcin   }
2272b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
2282b8d69caSLisandro Dalcin }
2292b8d69caSLisandro Dalcin 
2302b8d69caSLisandro Dalcin /*
2312b8d69caSLisandro Dalcin #undef __FUNCT__
2322b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawStringSetSize_Image"
2332b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawStringSetSize_Image(PetscDraw draw,PetscReal w,PetscReal h)
2342b8d69caSLisandro Dalcin {
2352b8d69caSLisandro Dalcin   PetscFunctionBegin;
2362b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
2372b8d69caSLisandro Dalcin }*/
2382b8d69caSLisandro Dalcin #define PetscDrawStringSetSize_Image NULL
2392b8d69caSLisandro Dalcin 
2402b8d69caSLisandro Dalcin #undef __FUNCT__
2412b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawStringGetSize_Image"
2422b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawStringGetSize_Image(PetscDraw draw,PetscReal *w,PetscReal  *h)
2432b8d69caSLisandro Dalcin {
2442b8d69caSLisandro Dalcin   PetscImage img = (PetscImage)draw->data;
2452b8d69caSLisandro Dalcin   PetscFunctionBegin;
2462b8d69caSLisandro Dalcin   {
2472b8d69caSLisandro Dalcin     int tw = PetscImageFontWidth;
2482b8d69caSLisandro Dalcin     int th = PetscImageFontHeight;
2492b8d69caSLisandro Dalcin     if (w) *w = tw*(draw->coor_xr - draw->coor_xl)/(img->w*(draw->port_xr - draw->port_xl));
2502b8d69caSLisandro Dalcin     if (h) *h = th*(draw->coor_yr - draw->coor_yl)/(img->h*(draw->port_yr - draw->port_yl));
2512b8d69caSLisandro Dalcin   }
2522b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
2532b8d69caSLisandro Dalcin }
2542b8d69caSLisandro Dalcin 
2552b8d69caSLisandro Dalcin #undef __FUNCT__
2562b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawString_Image"
2572b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawString_Image(PetscDraw draw,PetscReal x,PetscReal y,int c,const char text[])
2582b8d69caSLisandro Dalcin {
2592b8d69caSLisandro Dalcin   PetscImage     img = (PetscImage)draw->data;
2602b8d69caSLisandro Dalcin   PetscToken     token;
2612b8d69caSLisandro Dalcin   char           *subtext;
2622b8d69caSLisandro Dalcin   PetscErrorCode ierr;
2632b8d69caSLisandro Dalcin   PetscFunctionBegin;
2642b8d69caSLisandro Dalcin   PetscDrawValidColor(c);
2652b8d69caSLisandro Dalcin   {
2662b8d69caSLisandro Dalcin     int xx = XTRANS(draw,img,x);
2672b8d69caSLisandro Dalcin     int yy = YTRANS(draw,img,y);
2682b8d69caSLisandro Dalcin     ierr = PetscTokenCreate(text,'\n',&token);CHKERRQ(ierr);
2692b8d69caSLisandro Dalcin     ierr = PetscTokenFind(token,&subtext);CHKERRQ(ierr);
2702b8d69caSLisandro Dalcin     while (subtext) {
2712b8d69caSLisandro Dalcin       PetscImageDrawText(img,xx,yy,c,subtext);
2722b8d69caSLisandro Dalcin       yy += PetscImageFontHeight;
2732b8d69caSLisandro Dalcin       ierr = PetscTokenFind(token,&subtext);CHKERRQ(ierr);
2742b8d69caSLisandro Dalcin     }
2752b8d69caSLisandro Dalcin     ierr = PetscTokenDestroy(&token);CHKERRQ(ierr);
2762b8d69caSLisandro Dalcin   }
2772b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
2782b8d69caSLisandro Dalcin }
2792b8d69caSLisandro Dalcin 
2802b8d69caSLisandro Dalcin #undef __FUNCT__
2812b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawStringVertical_Image"
2822b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawStringVertical_Image(PetscDraw draw,PetscReal x,PetscReal y,int c,const char text[])
2832b8d69caSLisandro Dalcin {
2842b8d69caSLisandro Dalcin   PetscImage img = (PetscImage)draw->data;
2852b8d69caSLisandro Dalcin   PetscFunctionBegin;
2862b8d69caSLisandro Dalcin   PetscDrawValidColor(c);
2872b8d69caSLisandro Dalcin   {
2882b8d69caSLisandro Dalcin     char chr[2] = {0, 0};
2892b8d69caSLisandro Dalcin     int  xx = XTRANS(draw,img,x);
2902b8d69caSLisandro Dalcin     int  yy = YTRANS(draw,img,y);
2912b8d69caSLisandro Dalcin     int  offset = PetscImageFontHeight;
2922b8d69caSLisandro Dalcin     while ((chr[0] = *text++)) {
2932b8d69caSLisandro Dalcin       PetscImageDrawText(img,xx,yy+offset,c,chr);
2942b8d69caSLisandro Dalcin       yy += PetscImageFontHeight;
2952b8d69caSLisandro Dalcin     }
2962b8d69caSLisandro Dalcin   }
2972b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
2982b8d69caSLisandro Dalcin }
2992b8d69caSLisandro Dalcin 
3002b8d69caSLisandro Dalcin /*
3012b8d69caSLisandro Dalcin #undef __FUNCT__
3022b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawStringBoxed_Image"
3032b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawStringBoxed_Image(PetscDraw draw,PetscReal sxl,PetscReal syl,int sc,int bc,const char text[],PetscReal *w,PetscReal *h)
3042b8d69caSLisandro Dalcin {
3052b8d69caSLisandro Dalcin   PetscFunctionBegin;
3062b8d69caSLisandro Dalcin   if (w) *w = 0;
3072b8d69caSLisandro Dalcin   if (h) *h = 0;
3082b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
3092b8d69caSLisandro Dalcin */
3102b8d69caSLisandro Dalcin #define PetscDrawStringBoxed_Image NULL
3112b8d69caSLisandro Dalcin 
3122b8d69caSLisandro Dalcin /*
3132b8d69caSLisandro Dalcin #undef __FUNCT__
3142b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawFlush_Image"
3152b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawFlush_Image(PetscDraw draw)
3162b8d69caSLisandro Dalcin {
3172b8d69caSLisandro Dalcin   PetscFunctionBegin;
3182b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
3192b8d69caSLisandro Dalcin }*/
3202b8d69caSLisandro Dalcin #define PetscDrawFlush_Image NULL
3212b8d69caSLisandro Dalcin 
3222b8d69caSLisandro Dalcin #undef __FUNCT__
3232b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawClear_Image"
3242b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawClear_Image(PetscDraw draw)
3252b8d69caSLisandro Dalcin {
3262b8d69caSLisandro Dalcin   PetscImage     img = (PetscImage)draw->data;
3272b8d69caSLisandro Dalcin   PetscFunctionBegin;
3282b8d69caSLisandro Dalcin   {
3292b8d69caSLisandro Dalcin     PetscImageClear(img);
3302b8d69caSLisandro Dalcin   }
3312b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
3322b8d69caSLisandro Dalcin }
3332b8d69caSLisandro Dalcin 
3342b8d69caSLisandro Dalcin /*
3352b8d69caSLisandro Dalcin #undef __FUNCT__
3362b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawSetDoubleBuffer_Image"
3372b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawSetDoubleBuffer_Image(PetscDraw draw)
3382b8d69caSLisandro Dalcin {
3392b8d69caSLisandro Dalcin   PetscFunctionBegin;
3402b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
3412b8d69caSLisandro Dalcin }*/
3422b8d69caSLisandro Dalcin #define PetscDrawSetDoubleBuffer_Image NULL
3432b8d69caSLisandro Dalcin 
3442b8d69caSLisandro Dalcin #undef __FUNCT__
3452b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawGetPopup_Image"
3462b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawGetPopup_Image(PetscDraw draw,PetscDraw *popup)
3472b8d69caSLisandro Dalcin {
3482b8d69caSLisandro Dalcin   PetscBool      flg = PETSC_FALSE;
3492b8d69caSLisandro Dalcin   PetscErrorCode ierr;
3502b8d69caSLisandro Dalcin 
3512b8d69caSLisandro Dalcin   PetscFunctionBegin;
3522b8d69caSLisandro Dalcin   ierr = PetscOptionsGetBool(((PetscObject)draw)->options,((PetscObject)draw)->prefix,"-draw_popup",&flg,NULL);CHKERRQ(ierr);
3532b8d69caSLisandro Dalcin   if (!flg) {*popup = NULL; PetscFunctionReturn(0);}
3542b8d69caSLisandro Dalcin   ierr = PetscDrawCreate(PetscObjectComm((PetscObject)draw),NULL,NULL,0,0,220,220,popup);CHKERRQ(ierr);
3552b8d69caSLisandro Dalcin   ierr = PetscDrawSetType(*popup,PETSC_DRAW_IMAGE);CHKERRQ(ierr);
3562b8d69caSLisandro Dalcin   ierr = PetscObjectSetOptionsPrefix((PetscObject)*popup,"popup_");CHKERRQ(ierr);
3572b8d69caSLisandro Dalcin   ierr = PetscObjectAppendOptionsPrefix((PetscObject)*popup,((PetscObject)draw)->prefix);CHKERRQ(ierr);
3582b8d69caSLisandro Dalcin   draw->popup = *popup;
3592b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
3602b8d69caSLisandro Dalcin }
3612b8d69caSLisandro Dalcin 
3622b8d69caSLisandro Dalcin /*
3632b8d69caSLisandro Dalcin #undef __FUNCT__
3642b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawSetTitle_Image"
3652b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawSetTitle_Image(PetscDraw draw,const char title[])
3662b8d69caSLisandro Dalcin {
3672b8d69caSLisandro Dalcin   PetscFunctionBegin;
3682b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
3692b8d69caSLisandro Dalcin }*/
3702b8d69caSLisandro Dalcin #define PetscDrawSetTitle_Image NULL
3712b8d69caSLisandro Dalcin 
3722b8d69caSLisandro Dalcin /*
3732b8d69caSLisandro Dalcin #undef __FUNCT__
3742b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawCheckResizedWindow_Image"
3752b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawCheckResizedWindow_Image(PetscDraw draw)
3762b8d69caSLisandro Dalcin {
3772b8d69caSLisandro Dalcin   PetscFunctionBegin;
3782b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
3792b8d69caSLisandro Dalcin }*/
3802b8d69caSLisandro Dalcin #define PetscDrawCheckResizedWindow_Image NULL
3812b8d69caSLisandro Dalcin 
3822b8d69caSLisandro Dalcin #undef __FUNCT__
3832b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawResizeWindow_Image"
3842b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawResizeWindow_Image(PetscDraw draw,int w,int h)
3852b8d69caSLisandro Dalcin {
3862b8d69caSLisandro Dalcin   PetscImage     img = (PetscImage)draw->data;
3872b8d69caSLisandro Dalcin   PetscErrorCode ierr;
3882b8d69caSLisandro Dalcin 
3892b8d69caSLisandro Dalcin   PetscFunctionBegin;
3902b8d69caSLisandro Dalcin   if (w == img->w && h == img->h) PetscFunctionReturn(0);
3912b8d69caSLisandro Dalcin   ierr = PetscFree(img->buffer);CHKERRQ(ierr);
3922b8d69caSLisandro Dalcin 
3932b8d69caSLisandro Dalcin   img->w = w; img->h = h;
3942b8d69caSLisandro Dalcin   ierr = PetscCalloc1((size_t)(img->w*img->h),&img->buffer);CHKERRQ(ierr);
3952b8d69caSLisandro Dalcin   ierr = PetscDrawSetViewport_Image(draw,draw->port_xl,draw->port_yl,draw->port_xr,draw->port_yr);CHKERRQ(ierr);
3962b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
3972b8d69caSLisandro Dalcin }
3982b8d69caSLisandro Dalcin 
3992b8d69caSLisandro Dalcin #undef __FUNCT__
4002b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawDestroy_Image"
4012b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawDestroy_Image(PetscDraw draw)
4022b8d69caSLisandro Dalcin {
4032b8d69caSLisandro Dalcin   PetscImage     img = (PetscImage)draw->data;
4042b8d69caSLisandro Dalcin   PetscErrorCode ierr;
4052b8d69caSLisandro Dalcin 
4062b8d69caSLisandro Dalcin   PetscFunctionBegin;
40745f3bb6eSLisandro Dalcin   ierr = PetscDrawDestroy(&draw->popup);CHKERRQ(ierr);
4082b8d69caSLisandro Dalcin   ierr = PetscFree(img->buffer);CHKERRQ(ierr);
4092b8d69caSLisandro Dalcin   ierr = PetscFree(draw->data);CHKERRQ(ierr);
4102b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
4112b8d69caSLisandro Dalcin }
4122b8d69caSLisandro Dalcin 
4132b8d69caSLisandro Dalcin /*
4142b8d69caSLisandro Dalcin #undef __FUNCT__
4152b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawView_Image"
4162b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawView_Image(PetscDraw draw,PetscViewer viewer)
4172b8d69caSLisandro Dalcin {
4182b8d69caSLisandro Dalcin   PetscFunctionBegin;
4192b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
4202b8d69caSLisandro Dalcin }*/
4212b8d69caSLisandro Dalcin #define PetscDrawView_Image NULL
4222b8d69caSLisandro Dalcin 
4232b8d69caSLisandro Dalcin /*
4242b8d69caSLisandro Dalcin #undef __FUNCT__
4252b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawGetMouseButton_Image"
4262b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawGetMouseButton_Image(PetscDraw draw,PetscDrawButton *button,PetscReal *x_user,PetscReal *y_user,PetscReal *x_phys,PetscReal *y_phys)
4272b8d69caSLisandro Dalcin {
4282b8d69caSLisandro Dalcin   PetscFunctionBegin;
4292b8d69caSLisandro Dalcin   *button = PETSC_BUTTON_NONE;
4302b8d69caSLisandro Dalcin   if (x_user) *x_user = 0;
4312b8d69caSLisandro Dalcin   if (y_user) *y_user = 0;
4322b8d69caSLisandro Dalcin   if (x_phys) *x_phys = 0;
4332b8d69caSLisandro Dalcin   if (y_phys) *y_phys = 0;
4342b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
4352b8d69caSLisandro Dalcin }*/
4362b8d69caSLisandro Dalcin #define PetscDrawGetMouseButton_Image NULL
4372b8d69caSLisandro Dalcin 
4382b8d69caSLisandro Dalcin /*
4392b8d69caSLisandro Dalcin #undef __FUNCT__
4402b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawPause_Image"
4412b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawPause_Image(PetscDraw draw)
4422b8d69caSLisandro Dalcin {
4432b8d69caSLisandro Dalcin   PetscFunctionBegin;
4442b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
4452b8d69caSLisandro Dalcin }*/
4462b8d69caSLisandro Dalcin #define PetscDrawPause_Image NULL
4472b8d69caSLisandro Dalcin 
4482b8d69caSLisandro Dalcin /*
4492b8d69caSLisandro Dalcin #undef __FUNCT__
4502b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawBeginPage_Image"
4512b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawBeginPage_Image(PetscDraw draw)
4522b8d69caSLisandro Dalcin {
4532b8d69caSLisandro Dalcin   PetscFunctionBegin;
4542b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
4552b8d69caSLisandro Dalcin }*/
4562b8d69caSLisandro Dalcin #define PetscDrawBeginPage_Image NULL
4572b8d69caSLisandro Dalcin 
4582b8d69caSLisandro Dalcin /*
4592b8d69caSLisandro Dalcin #undef __FUNCT__
4602b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawEndPage_Image"
4612b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawEndPage_Image(PetscDraw draw)
4622b8d69caSLisandro Dalcin {
4632b8d69caSLisandro Dalcin   PetscFunctionBegin;
4642b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
4652b8d69caSLisandro Dalcin }*/
4662b8d69caSLisandro Dalcin #define PetscDrawEndPage_Image NULL
4672b8d69caSLisandro Dalcin 
4682b8d69caSLisandro Dalcin #undef __FUNCT__
4692b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawGetSingleton_Image"
4702b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawGetSingleton_Image(PetscDraw draw,PetscDraw *sdraw)
4712b8d69caSLisandro Dalcin {
4722b8d69caSLisandro Dalcin   PetscImage     pimg = (PetscImage)draw->data;
4732b8d69caSLisandro Dalcin   PetscImage     simg;
4742b8d69caSLisandro Dalcin   PetscErrorCode ierr;
4752b8d69caSLisandro Dalcin 
4762b8d69caSLisandro Dalcin   PetscFunctionBegin;
4772b8d69caSLisandro Dalcin   ierr = PetscDrawCreate(PETSC_COMM_SELF,NULL,NULL,0,0,draw->w,draw->h,sdraw);CHKERRQ(ierr);
4782b8d69caSLisandro Dalcin   ierr = PetscDrawSetType(*sdraw,PETSC_DRAW_IMAGE);CHKERRQ(ierr);
4792b8d69caSLisandro Dalcin   (*sdraw)->ops->resizewindow = NULL;
4802b8d69caSLisandro Dalcin   simg = (PetscImage)(*sdraw)->data;
4812b8d69caSLisandro Dalcin   ierr = PetscMemcpy(simg->buffer,pimg->buffer,(size_t)(pimg->w*pimg->h));CHKERRQ(ierr);
4822b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
4832b8d69caSLisandro Dalcin }
4842b8d69caSLisandro Dalcin 
4852b8d69caSLisandro Dalcin #undef __FUNCT__
4862b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawRestoreSingleton_Image"
4872b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawRestoreSingleton_Image(PetscDraw draw,PetscDraw *sdraw)
4882b8d69caSLisandro Dalcin {
4892b8d69caSLisandro Dalcin   PetscImage     pimg = (PetscImage)draw->data;
4902b8d69caSLisandro Dalcin   PetscImage     simg = (PetscImage)(*sdraw)->data;
4912b8d69caSLisandro Dalcin   PetscErrorCode ierr;
4922b8d69caSLisandro Dalcin 
4932b8d69caSLisandro Dalcin   PetscFunctionBegin;
4942b8d69caSLisandro Dalcin   ierr = PetscMemcpy(pimg->buffer,simg->buffer,(size_t)(pimg->w*pimg->h));CHKERRQ(ierr);
4952b8d69caSLisandro Dalcin   ierr = PetscDrawDestroy(sdraw);CHKERRQ(ierr);
4962b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
4972b8d69caSLisandro Dalcin }
4982b8d69caSLisandro Dalcin 
4992b8d69caSLisandro Dalcin /*
5002b8d69caSLisandro Dalcin #undef __FUNCT__
5012b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawSave_Image"
5022b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawSave_Image(PetscDraw draw)
5032b8d69caSLisandro Dalcin {
5042b8d69caSLisandro Dalcin   PetscFunctionBegin;
5052b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
5062b8d69caSLisandro Dalcin }*/
5072b8d69caSLisandro Dalcin #define PetscDrawSave_Image NULL
5082b8d69caSLisandro Dalcin 
5092b8d69caSLisandro Dalcin #undef __FUNCT__
5102b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawGetImage_Image"
5112b8d69caSLisandro Dalcin static PetscErrorCode PetscDrawGetImage_Image(PetscDraw draw,unsigned char palette[256][3],unsigned int *w,unsigned int *h,unsigned char *pixels[])
5122b8d69caSLisandro Dalcin {
5132b8d69caSLisandro Dalcin   PetscImage     img = (PetscImage)draw->data;
5142b8d69caSLisandro Dalcin   unsigned char  *buffer = NULL;
5152b8d69caSLisandro Dalcin   PetscMPIInt    rank,size;
5162b8d69caSLisandro Dalcin   PetscErrorCode ierr;
5172b8d69caSLisandro Dalcin 
5182b8d69caSLisandro Dalcin   PetscFunctionBegin;
5192b8d69caSLisandro Dalcin   if (w) *w = (unsigned int)img->w;
5202b8d69caSLisandro Dalcin   if (h) *h = (unsigned int)img->h;
5212b8d69caSLisandro Dalcin   if (pixels) *pixels = NULL;
5222b8d69caSLisandro Dalcin   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)draw),&rank);CHKERRQ(ierr);
5232b8d69caSLisandro Dalcin   if (!rank) {
5242b8d69caSLisandro Dalcin     ierr = PetscMemcpy(palette,img->palette,sizeof(img->palette));CHKERRQ(ierr);
5252b8d69caSLisandro Dalcin     ierr = PetscMalloc1((size_t)(img->w*img->h),&buffer);CHKERRQ(ierr);
5262b8d69caSLisandro Dalcin     *pixels = buffer;
5272b8d69caSLisandro Dalcin   }
5282b8d69caSLisandro Dalcin   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)draw),&size);CHKERRQ(ierr);
5292b8d69caSLisandro Dalcin   if (size == 1) {
5302b8d69caSLisandro Dalcin     ierr = PetscMemcpy(buffer,img->buffer,(size_t)(img->w*img->h));CHKERRQ(ierr);
5312b8d69caSLisandro Dalcin   } else {
5322b8d69caSLisandro Dalcin     ierr = MPI_Reduce(img->buffer,buffer,img->w*img->h,MPI_UNSIGNED_CHAR,MPI_MAX,0,PetscObjectComm((PetscObject)draw));CHKERRQ(ierr);
5332b8d69caSLisandro Dalcin   }
5342b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
5352b8d69caSLisandro Dalcin }
5362b8d69caSLisandro Dalcin 
5372b8d69caSLisandro Dalcin static struct _PetscDrawOps DvOps = {
5382b8d69caSLisandro Dalcin   PetscDrawSetDoubleBuffer_Image,
5392b8d69caSLisandro Dalcin   PetscDrawFlush_Image,
5402b8d69caSLisandro Dalcin   PetscDrawLine_Image,
5412b8d69caSLisandro Dalcin   PetscDrawLineSetWidth_Image,
5422b8d69caSLisandro Dalcin   PetscDrawLineGetWidth_Image,
5432b8d69caSLisandro Dalcin   PetscDrawPoint_Image,
5442b8d69caSLisandro Dalcin   PetscDrawPointSetSize_Image,
5452b8d69caSLisandro Dalcin   PetscDrawString_Image,
5462b8d69caSLisandro Dalcin   PetscDrawStringVertical_Image,
5472b8d69caSLisandro Dalcin   PetscDrawStringSetSize_Image,
5482b8d69caSLisandro Dalcin   PetscDrawStringGetSize_Image,
5492b8d69caSLisandro Dalcin   PetscDrawSetViewport_Image,
5502b8d69caSLisandro Dalcin   PetscDrawClear_Image,
5512b8d69caSLisandro Dalcin   PetscDrawRectangle_Image,
5522b8d69caSLisandro Dalcin   PetscDrawTriangle_Image,
5532b8d69caSLisandro Dalcin   PetscDrawEllipse_Image,
5542b8d69caSLisandro Dalcin   PetscDrawGetMouseButton_Image,
5552b8d69caSLisandro Dalcin   PetscDrawPause_Image,
5562b8d69caSLisandro Dalcin   PetscDrawBeginPage_Image,
5572b8d69caSLisandro Dalcin   PetscDrawEndPage_Image,
5582b8d69caSLisandro Dalcin   PetscDrawGetPopup_Image,
5592b8d69caSLisandro Dalcin   PetscDrawSetTitle_Image,
5602b8d69caSLisandro Dalcin   PetscDrawCheckResizedWindow_Image,
5612b8d69caSLisandro Dalcin   PetscDrawResizeWindow_Image,
5622b8d69caSLisandro Dalcin   PetscDrawDestroy_Image,
5632b8d69caSLisandro Dalcin   PetscDrawView_Image,
5642b8d69caSLisandro Dalcin   PetscDrawGetSingleton_Image,
5652b8d69caSLisandro Dalcin   PetscDrawRestoreSingleton_Image,
5662b8d69caSLisandro Dalcin   PetscDrawSave_Image,
5672b8d69caSLisandro Dalcin   PetscDrawGetImage_Image,
5682b8d69caSLisandro Dalcin   PetscDrawSetCoordinates_Image,
5692b8d69caSLisandro Dalcin   PetscDrawArrow_Image,
5702b8d69caSLisandro Dalcin   PetscDrawCoordinateToPixel_Image,
5712b8d69caSLisandro Dalcin   PetscDrawPixelToCoordinate_Image,
5722b8d69caSLisandro Dalcin   PetscDrawPointPixel_Image,
5732b8d69caSLisandro Dalcin   PetscDrawStringBoxed_Image
5742b8d69caSLisandro Dalcin };
5752b8d69caSLisandro Dalcin 
5762b8d69caSLisandro Dalcin static const unsigned char BasicColors[PETSC_DRAW_BASIC_COLORS][3] = {
5772b8d69caSLisandro Dalcin   { 255, 255, 255 }, /* white */
5782b8d69caSLisandro Dalcin   {   0,   0,   0 }, /* black */
5792b8d69caSLisandro Dalcin   { 255,   0,   0 }, /* red */
5802b8d69caSLisandro Dalcin   {   0, 255,   0 }, /* green */
5812b8d69caSLisandro Dalcin   {   0, 255, 255 }, /* cyan */
5822b8d69caSLisandro Dalcin   {   0,   0, 255 }, /* blue */
5832b8d69caSLisandro Dalcin   { 255,   0, 255 }, /* magenta */
5842b8d69caSLisandro Dalcin   { 127, 255, 212 }, /* aquamarine */
5852b8d69caSLisandro Dalcin   {  34, 139,  34 }, /* forestgreen */
5862b8d69caSLisandro Dalcin   { 255, 165,   0 }, /* orange */
5872b8d69caSLisandro Dalcin   { 238, 130, 238 }, /* violet */
5882b8d69caSLisandro Dalcin   { 165,  42,  42 }, /* brown */
5892b8d69caSLisandro Dalcin   { 255, 192, 203 }, /* pink */
5902b8d69caSLisandro Dalcin   { 255, 127,  80 }, /* coral */
5912b8d69caSLisandro Dalcin   { 190, 190, 190 }, /* gray */
5922b8d69caSLisandro Dalcin   { 255, 255,   0 }, /* yellow */
5932b8d69caSLisandro Dalcin   { 255, 215,   0 }, /* gold */
5942b8d69caSLisandro Dalcin   { 255, 182, 193 }, /* lightpink */
5952b8d69caSLisandro Dalcin   {  72, 209, 204 }, /* mediumturquoise */
5962b8d69caSLisandro Dalcin   { 240, 230, 140 }, /* khaki */
5972b8d69caSLisandro Dalcin   { 105, 105, 105 }, /* dimgray */
5982b8d69caSLisandro Dalcin   {  54, 205,  50 }, /* yellowgreen */
5992b8d69caSLisandro Dalcin   { 135, 206, 235 }, /* skyblue */
6002b8d69caSLisandro Dalcin   {   0, 100,   0 }, /* darkgreen */
6012b8d69caSLisandro Dalcin   {   0,   0, 128 }, /* navyblue */
6022b8d69caSLisandro Dalcin   { 244, 164,  96 }, /* sandybrown */
6032b8d69caSLisandro Dalcin   {  95, 158, 160 }, /* cadetblue */
6042b8d69caSLisandro Dalcin   { 176, 224, 230 }, /* powderblue */
6052b8d69caSLisandro Dalcin   { 255,  20, 147 }, /* deeppink */
6062b8d69caSLisandro Dalcin   { 216, 191, 216 }, /* thistle */
6072b8d69caSLisandro Dalcin   {  50, 205,  50 }, /* limegreen */
6082b8d69caSLisandro Dalcin   { 255, 240, 245 }, /* lavenderblush */
6092b8d69caSLisandro Dalcin   { 221, 160, 221 }, /* plum */
6102b8d69caSLisandro Dalcin };
6112b8d69caSLisandro Dalcin 
6122b8d69caSLisandro Dalcin 
6132b8d69caSLisandro Dalcin /*MC
6142b8d69caSLisandro Dalcin    PETSC_DRAW_IMAGE - PETSc graphics device that uses a raster buffer
6152b8d69caSLisandro Dalcin 
6162b8d69caSLisandro Dalcin    Options Database Keys:
6172b8d69caSLisandro Dalcin .  -draw_size w,h - size of image in pixels
6182b8d69caSLisandro Dalcin 
6192b8d69caSLisandro Dalcin    Level: beginner
6202b8d69caSLisandro Dalcin 
6212b8d69caSLisandro Dalcin .seealso:  PetscDrawOpenImage(), PetscDrawSetFromOptions()
6222b8d69caSLisandro Dalcin M*/
6232b8d69caSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscDrawCreate_Image(PetscDraw);
6242b8d69caSLisandro Dalcin 
6252b8d69caSLisandro Dalcin #undef __FUNCT__
6262b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawCreate_Image"
6272b8d69caSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscDrawCreate_Image(PetscDraw draw)
6282b8d69caSLisandro Dalcin {
6292b8d69caSLisandro Dalcin   PetscImage     img;
6302b8d69caSLisandro Dalcin   int            w = draw->w, h = draw->h;
6312b8d69caSLisandro Dalcin   PetscInt       size[2], nsize = 2;
6322b8d69caSLisandro Dalcin   PetscBool      set;
6332b8d69caSLisandro Dalcin   PetscErrorCode ierr;
6342b8d69caSLisandro Dalcin 
6352b8d69caSLisandro Dalcin   PetscFunctionBegin;
6362b8d69caSLisandro Dalcin   draw->pause   = 0;
6372b8d69caSLisandro Dalcin   draw->coor_xl = 0; draw->coor_xr = 1;
6382b8d69caSLisandro Dalcin   draw->coor_yl = 0; draw->coor_yr = 1;
6392b8d69caSLisandro Dalcin   draw->port_xl = 0; draw->port_xr = 1;
6402b8d69caSLisandro Dalcin   draw->port_yl = 0; draw->port_yr = 1;
6412b8d69caSLisandro Dalcin 
6422b8d69caSLisandro Dalcin   size[0] = w; if (size[0] < 1) size[0] = 300;
6432b8d69caSLisandro Dalcin   size[1] = h; if (size[1] < 1) size[1] = size[0];
6442b8d69caSLisandro Dalcin   ierr = PetscOptionsGetIntArray(((PetscObject)draw)->options,((PetscObject)draw)->prefix,"-draw_size",size,&nsize,&set);CHKERRQ(ierr);
6452b8d69caSLisandro Dalcin   if (set && nsize == 1) size[1] = size[0];
6462b8d69caSLisandro Dalcin   if (size[0] < 1) size[0] = 300;
6472b8d69caSLisandro Dalcin   if (size[1] < 1) size[1] = size[0];
6482b8d69caSLisandro Dalcin   draw->w = w = size[0]; draw->x = 0;
6492b8d69caSLisandro Dalcin   draw->h = h = size[1]; draw->x = 0;
6502b8d69caSLisandro Dalcin 
6512b8d69caSLisandro Dalcin   ierr = PetscNewLog(draw,&img);CHKERRQ(ierr);
6522b8d69caSLisandro Dalcin   ierr = PetscMemcpy(draw->ops,&DvOps,sizeof(DvOps));CHKERRQ(ierr);
6532b8d69caSLisandro Dalcin   draw->data = (void*)img;
6542b8d69caSLisandro Dalcin 
6552b8d69caSLisandro Dalcin   img->w = w; img->h = h;
6562b8d69caSLisandro Dalcin   ierr = PetscCalloc1((size_t)(img->w*img->h),&img->buffer);CHKERRQ(ierr);
6572b8d69caSLisandro Dalcin   PetscImageSetClip(img,0,0,img->w,img->h);
6582b8d69caSLisandro Dalcin   {
6592b8d69caSLisandro Dalcin     int i,k,ncolors = 256-PETSC_DRAW_BASIC_COLORS;
6602b8d69caSLisandro Dalcin     unsigned char R[256-PETSC_DRAW_BASIC_COLORS];
6612b8d69caSLisandro Dalcin     unsigned char G[256-PETSC_DRAW_BASIC_COLORS];
6622b8d69caSLisandro Dalcin     unsigned char B[256-PETSC_DRAW_BASIC_COLORS];
6632b8d69caSLisandro Dalcin     ierr = PetscDrawUtilitySetCmap(NULL,ncolors,R,G,B);CHKERRQ(ierr);
6642b8d69caSLisandro Dalcin     for (k=0; k<PETSC_DRAW_BASIC_COLORS; k++) {
6652b8d69caSLisandro Dalcin       img->palette[k][0] = BasicColors[k][0];
6662b8d69caSLisandro Dalcin       img->palette[k][1] = BasicColors[k][1];
6672b8d69caSLisandro Dalcin       img->palette[k][2] = BasicColors[k][2];
6682b8d69caSLisandro Dalcin     }
6692b8d69caSLisandro Dalcin     for (i=0; i<ncolors; i++, k++) {
6702b8d69caSLisandro Dalcin       img->palette[k][0] = R[i];
6712b8d69caSLisandro Dalcin       img->palette[k][1] = G[i];
6722b8d69caSLisandro Dalcin       img->palette[k][2] = B[i];
6732b8d69caSLisandro Dalcin     }
6742b8d69caSLisandro Dalcin   }
6752b8d69caSLisandro Dalcin 
6762b8d69caSLisandro Dalcin   if (!draw->savefilename ){ierr = PetscDrawSetSave(draw,"");CHKERRQ(ierr);}
6772b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
6782b8d69caSLisandro Dalcin }
6792b8d69caSLisandro Dalcin 
6802b8d69caSLisandro Dalcin #undef __FUNCT__
6812b8d69caSLisandro Dalcin #define __FUNCT__ "PetscDrawOpenImage"
6822b8d69caSLisandro Dalcin /*@C
6832b8d69caSLisandro Dalcin    PetscDrawOpenImage - Opens an image for use with the PetscDraw routines.
6842b8d69caSLisandro Dalcin 
6852b8d69caSLisandro Dalcin    Collective on MPI_Comm
6862b8d69caSLisandro Dalcin 
6872b8d69caSLisandro Dalcin    Input Parameters:
6882b8d69caSLisandro Dalcin +  comm - the communicator that will share image
6892b8d69caSLisandro Dalcin -  filename - optional name of the file
6902b8d69caSLisandro Dalcin -  w, h - the image width and height in pixels
6912b8d69caSLisandro Dalcin 
6922b8d69caSLisandro Dalcin    Output Parameters:
6932b8d69caSLisandro Dalcin .  draw - the drawing context.
6942b8d69caSLisandro Dalcin 
6952b8d69caSLisandro Dalcin    Level: beginner
6962b8d69caSLisandro Dalcin 
6972b8d69caSLisandro Dalcin .seealso: PetscDrawSetSave(), PetscDrawSetFromOptions(), PetscDrawCreate(), PetscDrawDestroy()
6982b8d69caSLisandro Dalcin @*/
6992b8d69caSLisandro Dalcin PetscErrorCode PetscDrawOpenImage(MPI_Comm comm,const char filename[],int w,int h,PetscDraw *draw)
7002b8d69caSLisandro Dalcin {
7012b8d69caSLisandro Dalcin   PetscErrorCode ierr;
7022b8d69caSLisandro Dalcin 
7032b8d69caSLisandro Dalcin   PetscFunctionBegin;
7042b8d69caSLisandro Dalcin   ierr = PetscDrawCreate(comm,NULL,NULL,0,0,w,h,draw);CHKERRQ(ierr);
7052b8d69caSLisandro Dalcin   ierr = PetscDrawSetType(*draw,PETSC_DRAW_IMAGE);CHKERRQ(ierr);
7062b8d69caSLisandro Dalcin   ierr = PetscDrawSetSave(*draw,filename);CHKERRQ(ierr);
7072b8d69caSLisandro Dalcin   PetscFunctionReturn(0);
7082b8d69caSLisandro Dalcin }
709