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