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